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