Hibernate XML-具有一对一映射的复合ID

时间:2019-06-27 11:48:39

标签: java xml hibernate

我无法使用它。错误显示Broken column mapping。它必须是单面的一对一映射。只有Composite-id的一部分与另一个实体连接。频道将根据登录用户的访问频道进行插入。我有两节课。

public class UserModel implements Serializable{
    private final Long id;
    private final UserLimitsModel userLimitsModel;

}
public class UserLimitsModel implements Serializable{
    private final Long userId;    
    private final String channel;
}

然后2个休眠的.xml映射

<hibernate-mapping>
    <class name="abcdefgh.UserLimitsModel" table="USER_LIMITS" lazy="false">
        <composite-id>
            <key-property name="userId" type="long">
                <column name="USER_ID" not-null="true"/>
            </key-property>
            <key-property name="channel" type="string" length="20">
                <column name="CHANNEL" not-null="true"/>
            </key-property>
        </composite-id>
    </class>
</hibernate-mapping>
<hibernate-mapping>
    <class name="abcdefgh.UserModel" table="USER" lazy="false">
        <id name="id" type="long">
            <column name="ID" precision="19" scale="0" />
            <generator class="sequence">
                <param name="sequence_name">ID_SEQ</param>
            </generator>
        </id>
        <one-to-one name="userLimitsModel" class="abcdefgh.UserLimitsModel" cascade="all"/>
    </class>
</hibernate-mapping>

因此,唯一的连接是UserModel.id = UserLimitsModel.userId,而通道保持独立。

1 个答案:

答案 0 :(得分:0)

您好,问题是您没有使用主键加入。此外,UserModel中的列名称为ID,而UserLimitsModel中的列名称为USER_ID。您需要告诉休眠方式如何执行联接  您可以通过在一对一元素上定义property-ref来实现。

<one-to-one name="userLimitsModel" class="abcdefgh.UserLimitsModel" property-ref="userId" cascade="all"/>
  

property-ref(可选):关联的属性的名称   连接到此类的主键的类。如果不   指定后,将使用关联类的主键。