2013-09-24 97 views
3

任何人都會告訴我我錯在哪裏。已經浪費了一天。 問題是爲什麼hibernate(v 3.5.0 FINAL)沒有在cdl_group_module表中創建外鍵?它只是創建只有單列的表格,即id(PK)。我想要一對一的單向映射。我不能使用雙向映射,因爲cdl_group也被其他表使用,與cdl_module相同。一對一單向休眠映射不會在創建表時創建外鍵

以下是我的POJO。

public class CDLGroupModule extends AbstractDomainObject { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private Group group; 
    private CDLModule cdlModule; 

    /** 
    * @return the group 
    */ 
    public Group getGroup() { 
     return group; 
    } 

    /** 
    * @param group 
    *   the group to set 
    */ 
    public void setGroup(Group group) { 
     this.group = group; 
    } 

    /** 
    * @return the cdlModule 
    */ 
    public CDLModule getCdlModule() { 
     return cdlModule; 
    } 

    /** 
    * @param cdlModule 
    *   the cdlModule to set 
    */ 
    public void setCdlModule(CDLModule cdlModule) { 
     this.cdlModule = cdlModule; 
    } 

} 


public class Group extends AbstractDomainObject{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private String name; 
    private String description; 

    public Group() { 
    } 

    public Group(String name, String description) { 
     this.name = name; 
     this.description = description; 
    } 

    /** 
    * @return the name 
    */ 
    public String getName() { 
     return name; 
    } 
    /** 
    * @param name the name to set 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 
    /** 
    * @return the description 
    */ 
    public String getDescription() { 
     return description; 
    } 
    /** 
    * @param description the description to set 
    */ 
    public void setDescription(String description) { 
     this.description = description; 
    } 

    @Override 
    public String toString() { 
     return "[Group : { id : " + id + ", name : " + name + ", description :" + description + " }]"; 
    } 

} 


public class CDLModule extends AbstractDomainObject { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private CdlModuleEnum module; 

    /** 
    * @return the module 
    */ 
    public CdlModuleEnum getModule() { 
     return module; 
    } 

    /** 
    * @param module 
    *   the module to set 
    */ 
    public void setModule(CdlModuleEnum module) { 
     this.module = module; 
    } 

} 

下面是我的hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="com.qait.cdl.commons.domain"> 
    <class name="CDLGroupModule" table="cdl_group_module"> 

     <id name="id" type="long" column="id"> 
      <generator class="native" /> 
     </id> 

     <!-- <many-to-one name="group" cascade="all" fetch="join" 
      lazy="false" class="Group" not-null="true" unique="true"/> 

     <many-to-one name="cdlModule" cascade="all" fetch="join" 
      lazy="false" class="CDLModule" not-null="true" unique="true"/> --> 

     <one-to-one name="group" cascade="all-delete-orphan" fetch="join" 
      lazy="false" class="Group" /> 

     <one-to-one name="cdlModule" cascade="all-delete-orphan" fetch="join" 
      lazy="false" class="CDLModule" /> 


    </class> 
</hibernate-mapping> 

休眠創建cdl_groupcdl_module表已經成功。我的ID屬性存在於AbstractDomainObject所有POJO正在擴展的類。如果我試過多對一映射使用unique = true而不是一對一映射比hibernate甚至不創建表。 背後的原因是什麼? 任何形式的幫助將是可觀的。你可以問,如果你想從我身邊獲得更多信息。

+0

你可以發佈ypur'CDLModule'實體和映射嗎? – erencan

回答

1

看來hibernate一對一會嘗試在PK上映射。在獲取cdl_group_module時,它將嘗試填充與具有與cdl_group_module的PK相同的PK的任何cdl_group的關係。當您刪除並添加新的cdl_group環境時,這會變得非常忌諱。

嘗試設置此屬性以創建FK: 「property-ref(可選):與此類的主鍵相關聯的關聯類的屬性的名稱如果未指定,則主鍵使用關聯的類。「