3

誰か私が間違っているところを教えてください。すでに一日を無駄にしていた。hibernate(v 3.5.0 FINAL) が cdl_group_module テーブルに外部キーを作成しないのはなぜですか? 単一の列、つまりid(PK)のみを持つテーブルを作成するだけです。1 対 1 の一方向マッピングが必要です。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>

Hibernate はcdl_groupcdl_moduleテーブルを既に正常に作成しています。私のidプロパティは、すべての POJO が拡張しているAbstractDomainObjectクラスに存在します。1対1のマッピングの代わりにunique=trueを使用して多対1のマッピングを試みた場合、休止状態はテーブルを作成しません。その背後にある理由は何ですか?どんな種類の助けもかなりのものです。私の側からさらに情報が必要かどうかを尋ねることができます.

4

1 に答える 1

1

1 対 1 の休止状態は、PK にマップしようとするようです。cdl_group_module をフェッチすると、cdl_group_module の PK と同じ PK を持つ任意の cdl_group との関係を設定しようとします。新しい cdl_group エンティティを削除して追加すると、これはかなりおかしなことになります。

このプロパティを設定して FK を作成してみてください: "property-ref (オプション): このクラスの主キーに結合された関連クラスのプロパティの名前。指定しない場合、関連クラスの主キーが使用されます。 ."

于 2013-10-01T06:20:44.610 に答える