6

私は 2 つの非常に単純なオブジェクトを持っており、一方のオブジェクトにはもう一方のオブジェクトを「1 対多」の関係でセットに含める必要があります。オブジェクトはデータベースに正しく挿入されますが、「子」テーブルの外部キーは常に「null」です。

理由がわかりません:

これはテスト オブジェクトであり、そのセットに子を保持します。

@Entity
@Table(name="test")
public class TestObj {

    public TestObj(){}

    private Long id;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    private Set<Children> children = new HashSet<Children>();

    @OneToMany(mappedBy = "testObj", cascade = CascadeType.ALL)
    public synchronized Set<Children> getChildren() {
        return children;
    }
    public synchronized void setChildren(Set<Children> children) {
        this.children = children;
    }
    public void addChildren(Children child){
        children.add(child);
    }
}

これは子オブジェクトで、"TestObj" への後方リンクを保持しています。

@Entity
@Table(name = "children")
public class Children {

    public Children(){}

    private Long id;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    private TestObj testObj;

    @ManyToOne
    @JoinColumn
    public TestObj getTestObj() {
        return testObj;
    }

    public void setTestObj(TestObj testObj) {
        this.testObj = testObj;
    }
}

このオブジェクトを次のコードで永続化します。

EntityManagerFactory entityManagerFactory = HibernateEntityMangerSingelton.getEntityManagerFactory();
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();


TestObj user = new TestObj();

Children child = new Children();
user.addChildren(child);
try {

    entityManager.persist(user);

    entityManager.getTransaction().commit();

} catch (Exception e) {
    System.out.println(e);
}finally{
    entityManager.close();
}

なぜこれが起こっているのか説明できますか?

4

2 に答える 2

8

それは非常に簡単です:testObjフィールドを初期化することはChildrenありません (Child、BTW という名前にする必要があります)。Children.testObjは関連付けの所有者であり、結合列にマップされるフィールドであるため、null の場合、結合列は null になります。

于 2013-05-31T20:45:22.317 に答える
4

同様の問題があり、所有者側のセッターを呼び出すことで解決しました。TestObj が所有者側で初期化されるように、TestObj に子を設定して追加する 2 つのメソッドを次のように変更する必要があります。

public synchronized void setChildren(Set<Children> children) 

{



this.children = children;


for(Children child : children)
    {
    // initializing the TestObj instance in Children class (Owner side) so that it is not a null and PK can be created
            child.setTestObj(this);
    }
    }

2 番目の方法:

public void addChildren(Children child)
{
    children.add(child);
//Intializing the TestObj instance at the owner side
    child.setTestObj(this);
}
于 2014-09-12T08:39:36.520 に答える