1

私は2つのエンティティを持っています:

@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 = "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;
}

マッピングを修正するかどうかはわかりませんが、一般的な考え方は次のとおりです。「人」が同じグループに属している場合、同じ「もの」を持っている必要があります。

最初の質問: このマッピングはイデオロギー的にも技術的にも正しいですか?

もし、そうなら:

アノテーションを使用して動的に DB を作成します。そして、それは私が期待していない制約を生み出します。

ここに画像の説明を入力

このコードを実行すると、次のようになります。

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

0 に答える 0