この 4 時間、私は必死に次のマッピングを機能させようとしました。
@Entity
public class Foo {
@Basic
private String bar;
@Id
@Column(name = "FOO_ID")
@Type(type = "foo.bar.OracleGuidType")
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
private UUID id;
@ManyToMany(mappedBy = "parentFoos", fetch = FetchType.EAGER)
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@MapKeyColumn(name = "NESTED_FOO_KEY")
private Map<String, Foo> nestedFoos = new
HashMap<String, Foo>();
@ManyToMany
@JoinTable(
name = "FOO_RELATIONSHIP",
joinColumns = @JoinColumn(name = "NESTED_FOO_ID",
referencedColumnName = "FOO_ID"),
inverseJoinColumns = @JoinColumn(name = "PARENT_FOO_ID",
referencedColumnName = "FOO_ID")
)
private Set<Foo> parentFoos = new HashSet<Foo>();
//getters/setters
}
マッピングは複雑かもしれませんが、それが要件です。
問題は、次のことをしようとすると
Foo parent = new Foo();
parent.setWhatever("parent");
Foo child = new Foo();
child.setWhatever("child");
Session currentSession = sessionFactory.getCurrentSession();
Transaction tx = currentSession.getTransaction();
tx.begin();
currentSession.saveOrUpdate(child);
tx.commit();
currentSession = sessionFactory.getCurrentSession();
tx = currentSession.getTransaction();
tx.begin();
child.getParentFoos().add(parent);
parent.getNestedFoos().put("ASDF_KEY", child);
currentSession.saveOrUpdate(parent);
tx.commit();
私が得たものは次のとおりです:
Hibernate: Foo (何でも、FOO_ID) 値に挿入 (?, ?)
Hibernate: Foo (何でも、FOO_ID) 値に挿入 (?, ?)
Hibernate: Foo セットを更新 =? FOO_ID=?
Hibernate: FOO_RELATIONSHIP (NESTED_FOO_ID, PARENT_FOO_ID) 値 (?, ?) に挿入
hibernate は mapkeycolumn を無視するようですが (hbm2ddl を介して作成されます)、次に取得するのはこの例外です
原因: java.sql.BatchUpdateException: ORA-01400: NULL を ("BAR"."FOO_RELATIONSHIP"."NESTED_FOO_KEY") に挿入できません
私は、このエンティティはマッピング可能であると信じています。この問題の解決を手伝ってください。