2011-10-11 3 views
0

자, 그럼 부모 개체와 자식 개체가 2 개 있습니다. 아이는 기본적으로 다음과 같습니다Hibernate - 자동으로 외래 키를 자식에게 할당합니까?

public class Child implements Serializable 
{ 

    // primary (composite) key 
    private int parentId; 
    private String name; 

    // random value 
    private String val; 

    public Child(String name, String val) { 
     this.name = name; 
     this.val = val; 
     // note: parentId is not assigned a value 
    } 

    public void setParentId(int id) { 

    [...] 
} 

는 내가 원하는 자동으로 한 번 부모 개체가 생성 된 아동의 부모 ID를 설정하는 최대 절전을 위해 기본적으로. 부모 개체를 데이터베이스에 저장 한 후 부모 개체에 자식 개체를 추가해야합니까?

부모의 XML 매핑 보이는 등 :

`<map name="children" inverse="true" lazy="true" cascade="all,delete-orphan"> 
    <cache usage="nonstrict-read-write"/> 
    <key column="parent_id"/> 
    <index column="child_name" type="string"/> 
    <one-to-many class="myPack.Child"/> 
</map>` 

와 아이의 XML : 당신이 외래 키 사용과 함께 부모 - 자식을 삽입 최대 절전 모드 원하는

<hibernate-mapping package="myPack"> 

    <class name="Child" table="child_tbl" lazy="true"> 

     <composite-id> 
      <key-property name="ParentId" type="int" column="parent_id"/> 
      <key-property name="Name" column="name" type="string"/> 
     </composite-id> 

     <property name="Val" blablabla 
[...] 
+0

그렇다면 문제가 해결 되었습니까? 답글이나 의견이 없습니다. – ManuPK

+0

내가 한 일은 부모 개체를 저장하고 부모 참조를 설정할 때 DAO의 모든 자식을 반복하는 것이 었습니다. 내가 원래하고 싶었던 것은 아니지만 잘 작동합니다. – honeyp0t

답변

0

ID보다 객체 매핑.

는에 지금 추가 AMAIN에서 hbm.xml 파일에

public class AMain { 

//Properties of A. 
List<ASub3> subList; 
..... 
} 

public class ASub3 { 
..... 
AMain parent; 
..... 
} 

,

<list name="subList" inverse="true" cascade="all" lazy="false"> 
     <key column="a_id" /> 
     <list-index column="as3_id" /> 
     <one-to-many class="com.manu.hibernate.mappings.domain.ASub3" /> 
    </list> 

이 Asub3에 추가 here에서 예를 들자면

<many-to-one name="parent" class="com.manu.hibernate.mappings.domain.AMain" 
column="a_id" unique="true" cascade="save-update" /> 

을 수 있습니다 클라이언트 코드는 다음과 같이 빈을 사용합니다.

 AMain a = new AMain("A"); 
    ASub3 as3a = new ASub3("List - 1"); 
    ASub3 as3b = new ASub3("List - 2"); 
    ASub3 as3c = new ASub3("List - 3"); 
    as3a.setParent(a); 
    as3b.setParent(a); 
    as3c.setParent(a); 
    List<ASub3> subList = new ArrayList<ASub3>(); 
    subList.add(as3a); 
    subList.add(as3b); 
    subList.add(as3c); 

    a.setSubList(subList); 

이제 AMain을 저장하면 AMain에 대한 외래 키가있는 AMain과 ASub3이 모두 업데이트됩니다 (해당 테이블을 의미 함).

0

안녕하세요. 이전에도 같은 문제에 직면했습니다. 어노테이션 클래스에 해결책이있다. 부모님 수업이 없으므로 제 가정에 맡기십시오.

public class Parent implements Serializable 
{ 
    // Id is generated by sequence so it is not assigned when parent will be created 
    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_APP") 
    @SequenceGenerator(name="SEQ_APP",sequenceName="SEQ_APP") 
    private Integer id; 
    private String name; 

    @ManyToMany 
    @JoinTable(
     name = "CHILD_TABLE", 
     joinColumns = { @JoinColumn(name = "PARENT_ID")}, 
     inverseJoinColumns = {@JoinColumn(name = "NAME")} 
    ) 
    @Cascade(CascadeType.DELETE_ORPHAN) 
    private Set<Child> childs= new HashSet<Child>(); 

    // getters and setters 
} 



public class Child { 
     // primary (composite) key 

     private int parentId; 
     private String name; }