4

親と子の2つのオブジェクトがあります。子は、PARENTテーブル(MySQLデータベース)のPARENT_IDフィールドに戻る外部キーを持っています。

親オブジェクトと子オブジェクトが同時に作成/アセンブルされ、persistが呼び出された場合、子PARENT_ID外部キーは自動的に入力されません。

サンプルコード:

@Entity
@Table(name = "PARENT")
public class Parent {
    @Column(name = "PARENT_ID")
    private Long parentId;

    @OneToMany(mappedBy = "parent")
    private List<Child> children;
}

@Entity
@Table(name = "CHILD")
public class Child {
    @Column(name = "CHILD_ID")
    private Long childId;

    @Column(name = "PARENT_ID")
    private Long parentId;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;
}

永続性のための2つのサンプルがあります:

1)Hibernate EntityManagerの使用:

@PersistenceContext
EntityManager em;

...

em.persist(parent);

2)Spring Data JPA JpaRepositoryインスタンスの使用:

public interface ParentRepository extends JpaRepository<Parent, Long> {

}

そして私のParentServiceImplで:

@Autowired
private ParentRepository parentRepository;

...

public Parent save(Parent parent) {
    return parentRepository.save(parent);
}

外部キーを設定するために推奨される戦略は何ですか?親オブジェクトを最初に永続化し、次にその時点で子オブジェクトの外部キーを設定する必要がありますか?または、外部キーを自動的にまたは参照によって設定して、一度にすべてを永続化する方法はありますか?

編集:永続性サンプルが追加されました。

編集2(修正済み!):RyanStewartの2番目のポイントに従って問題が解決されました。子オブジェクトからLongparentIdフィールドを削除し、parentIdの@Column参照をゲッターに配置しました。また、参照を正しく設定するようにしてください(重要なのは、親への子参照です)。

4

1 に答える 1

5

そのコードには、機能を妨げる2つのことがあります。

  1. あなたのエンティティにはありません@Id。これは一例であるため、おそらく省略しただけですが、指摘する価値があります。
  2. 列をダブルマップしましたparent_id。子には、同じ列にマップされたLongフィールドとParentフィールドの両方があります。ロングを取り除きます。それはあなたが求めている親の関係です。

その後、結合列を使用した完全に従来の双方向の1対多があります。それがうまくいかない場合は、それらを作成して保存するコードで何か問題が発生しています。おそらく、オブジェクトを適切に作成していません。これらのエンティティを使用した正しいコードは、次のようになります。

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Parent p = new Parent();
Child child = new Child();
child.parent = p;
Child child1 = new Child();
child1.parent = p;
p.children = Arrays.asList(child, child1);
session.save(p);
session.save(p.children.get(0));
session.save(p.children.get(1));
tx.commit();

特に、子は子の親だけでなく親にも設定する必要があることに注意してください。半分壊れたオブジェクトモデルを構築しないでください。Hibernateが混乱をクリーンアップすることを期待してください。多くの人は、この一見明白な要件を無視し、Hibernateが不安定または信頼できないように見える理由を疑問に思います。

于 2012-05-26T22:03:12.420 に答える