1

次のような非常に具体的なシナリオがあります。

public class Person
{
    Long id;
    Collection<PersonRelation> personRelationCollection = new LinkedHashSet<PersonRelation>();
/**
  has respective getter and setter
**/
}

public class PersonRelation
{
    Long id;
    Long parentPersonId;  // here I don't want parentPersonId of type Person
    Long childPersonId;   // here also I don't want childPersonId of type Person
    String relationType;
/**
  has respective getter setter
**/
}

私のマッピングファイルには、次のものがあります

<class name="Person" table="PERSON">
     <id name="id" column="IDENTIFIER">
        <generator class="native"/>
    </id>
    <set 
        name="personRelationCollection"
        table="PERSON_RELATION"
        cascade="all"
       >
       <key column="PARENT_PERSON_ID"/>
       <one-to-many class="PersonRelation"/>
    </set>
</class>

<class name="PersonRelation" table="PERSON_RELATION">
    <id name="id" column="IDENTIFIER">
        <generator class="native"/>
    </id>

   <!-- following many-to-one mapping doesn't work-->
   <!-- I need help here to satisfy my requirement -->
    <many-to-one 
          name="parentPersonId" 
          column="PARENT_PERSON_ID"
          class="Person"
          not-null="true"/>   
    <Property name="childPersonId" column="CHILD_PERSON_ID"/>
    <property name="relationType" column="RELATION_TYPE"/>    
</class>

この例では、PersonRelation クラスのように、parentPersonId 属性が Long であり、Person のタイプではないため、 org.hibernate.MappingException: Association references unmapped class PersonRelation $ を取得しています

4

2 に答える 2

0

IDによる参照は忘れてください。Hibernate では、テーブルではなくオブジェクトを操作します。あなたのコードは次のように書くことができると思います:

@Entity  
@Table(name="your_table")  
public class Item{  

   private Long id;  
   private Item parentItem;  
   private List<Item> children;  

   @Id  
   @GeneratedValue(strategy=GenerationType.AUTO)  
   public Long getId(){  
   }  

   @ManyToOne()//Your options  
   public Item getParentItem(){  
   }  

   @OneToMane(mappedBy="parentItem")  
   public List<Item> getChildren(){  
   }  

   //Setters omitted  
}  
于 2012-07-20T12:24:41.193 に答える
0

最後に私は自分自身の答えを見つけました。私たちがしなければならない非常に小さなことは次のとおりです。

<class name="PersonRelation" table="PERSON_RELATION">
    <id name="id" column="IDENTIFIER">
        <generator class="native"/>
    </id>

   <!-- here remove many-to-one mapping ---- it's not needed-->
   <!-- treet participantPersonId as a simple property and everything will work --> 
    <Property name="parentPersonId" column="PARENT_PERSON_ID" type="Long"/>

    <Property name="childPersonId" column="CHILD_PERSON_ID"/>
    <property name="relationType" column="RELATION_TYPE"/>    
</class>

これは完全に正常に機能します。:)

ここで、Person オブジェクトを挿入すると、PersonRelation オブジェクトも挿入されません。PersonRelation オブジェクトを明示的に挿入する必要があります。おそらく、Person オブジェクトを取得すると、PersonRelation のコレクションが得られます。ここでは、PersonRelation コレクションを明示的に取得する必要はありません。

于 2012-07-21T12:25:19.610 に答える