Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA OneToMany JoinColumn非主键_Java_Jpa_One To Many_Unique Index_Joincolumn - Fatal编程技术网

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'}]})