2

この 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") に挿入できません

私は、このエンティティはマッピング可能であると信じています。この問題の解決を手伝ってください。

4

1 に答える 1