Java JPA OneToMany JoinColumn非主键
我有两个实体:Java JPA OneToMany JoinColumn非主键,java,jpa,one-to-many,unique-index,joincolumn,Java,Jpa,One To Many,Unique Index,Joincolumn,我有两个实体: @Entity @Table(name = "THINGS") public class Thing { @Id @Column(name = "THING_PK") @GeneratedValue(strategy= GenerationType.IDENTITY) private Long id; @Column(name= "NAME") private String name; } 及 这合乎逻辑吗?当然,我可能会创建
@Entity
@Table(name = "THINGS")
public class Thing {
@Id
@Column(name = "THING_PK")
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
@Column(name= "NAME")
private String name;
}
及
这合乎逻辑吗?当然,我可能会创建一个组类来包装/表示此组id对您的模型的真正意义。至于外键,这应该是预期的,因为它是联接列注释指定的。如果个人中的group_id字段不是唯一的,那么关系是M:M而不是1:M,没有意义-它真的应该分解为一个组中介,以便许多人和许多事物可以属于同一个组。这符合逻辑吗?当然,我可能会创建一个组类来包装/表示此组id对您的模型的真正意义。至于外键,这应该是预期的,因为它是联接列注释指定的。如果person中的group_id字段不是唯一的,那么关系是M:M而不是1:M,没有意义-它确实应该分解为一个组中介,以便许多人和许多事物可以属于同一个组。
@Entity
@Table(name = "PERSONS")
public class Person {
@Id
@Column(name = "PERSON_PK")
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
@Column(name= "FIRSTNAME")
private String firstName;
@Column(name= "GROUP_ID")
private Long groupId;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "GROUP_ID", referencedColumnName = "GROUP_ID")
private List<Thing> things;
}
List<Thing> thingList = new ArrayList<Thing>();
Person person = new Person();
person.setFirstName("Name1");
person.setGroupId(1L);
person.setThings(thingList);
Thing thing1 = new Thing();
thing1.setName("Name1");
thingList.add(thing1);
Thing thing2 = new Thing();
thing2.setName("Name2");
thingList.add(thing2);
entityManager.persist(person);
List<Thing> thingList2 = new ArrayList<Thing>();
Person person2 = new Person();
person2.setFirstName("Name2");
person2.setGroupId(2L);
person2.setThings(thingList2);
Thing thing3 = new Thing();
thing3.setName("Name3");
thingList2.add(thing3);
entityManager.persist(person2);
Person person3 = new Person();
person3.setFirstName("Name3");
person3.setGroupId(1L);
person3.setThings(thingList);
entityManager.persist(person3);
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.h2.jdbc.JdbcSQLException:Unique index or primary key violation: "FK_THINGS_GROUP_ID_INDEX_2 ON PUBLIC.PERSONS(GROUP_ID) VALUES (1, 2)"; SQL statement:
INSERT INTO PERSONS (FIRSTNAME, GROUP_ID) VALUES (?, ?) [23505-188]
Error Code: 23505
Call: INSERT INTO PERSONS (FIRSTNAME, GROUP_ID) VALUES (?, ?)
bind => [Name1, 1]
Query: InsertObjectQuery(Person{id=null, firstName='Name1', groupId=1, things=[Thing{id=null, name='Name1'}, Thing{id=null, name='Name2'}]})