이 콘텐츠는 선택한 언어로 제공되지 않습니다.

21.3. Bidirectional One-to-many Example


Suppose we start with a simple <one-to-many> association from Parent to Child.
<set name="children">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>
Copy to Clipboard Toggle word wrap
If we were to execute the following code:
Parent p = .....;
Child c = new Child();
p.getChildren().add(c);
session.save(c);
session.flush();
Copy to Clipboard Toggle word wrap
Hibernate would issue two SQL statements:
  • an INSERT to create the record for c
  • an UPDATE to create the link from p to c
This is not only inefficient, but also violates any NOT NULL constraint on the parent_id column. You can fix the nullability constraint violation by specifying not-null="true" in the collection mapping:
<set name="children">
    <key column="parent_id" not-null="true"/>
    <one-to-many class="Child"/>
</set>
Copy to Clipboard Toggle word wrap
However, this is not the recommended solution.
The underlying cause of this behavior is that the link (the foreign key parent_id) from p to c is not considered part of the state of the Child object and is therefore not created in the INSERT. The solution is to make the link part of the Child mapping.
<many-to-one name="parent" column="parent_id" not-null="true"/>
Copy to Clipboard Toggle word wrap
You also need to add the parent property to the Child class.
Now that the Child entity is managing the state of the link, we tell the collection not to update the link. We use the inverse attribute to do this:
<set name="children" inverse="true">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>
Copy to Clipboard Toggle word wrap
The following code would be used to add a new Child:
Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();
Copy to Clipboard Toggle word wrap
Only one SQL INSERT would now be issued.
You could also create an addChild() method of Parent.
public void addChild(Child c) {
    c.setParent(this);
    children.add(c);
}
Copy to Clipboard Toggle word wrap
The code to add a Child looks like this:
Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
p.addChild(c);
session.save(c);
session.flush();
Copy to Clipboard Toggle word wrap
맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat