【问题标题】:Hibernate: 2 subclass mapping the same key columnHibernate:2个子类映射相同的键列
【发布时间】:2015-05-11 17:42:51
【问题描述】:

我想跨子类映射相同的键列,本示例的 parent_id。 ClientProfileDO 和 BusinessProfileDO 都继承自 UserProfileDO。它们在同一张表 USERPROFILE 上。因此,它们在 Contact 表中引用相同的外键。是不是逻辑不正确?

<hibernate-mapping    package="com.rentorama2.frontpage.client.serialize"default-lazy="false">
<class name="UserProfileDO" table="USERPROFILE">
<id name="oid" type="long" column="oid" >
    <generator class="increment">
        <param name="initial_value">1</param>
    </generator>
</id>
<discriminator column="dcolumn" type="string" length="5"/>
<property name="acctOid">
    <column name="acctOid" />
</property>  
<property name="email">
    <column name="email"/>
</property>

<subclass name="ClientProfileDO" discriminator-value="CP">
    <list name="c_contacts" cascade="all">
        <key column="parent_id" not-null="true"/>
        <index column="idx"/>
        <one-to-many class="Contact"/>
    </list>
</subclass> 
<subclass name="BusinessProfileDO" discriminator-value="BP">
    <property name="b_updateAnnouncement">
        <column name="updateAnnouncement"/>
    </property>
    <list name="b_contacts" cascade="all">
        <key column="parent_id" not-null="true"/>
        <index column="idx"/>
        <one-to-many class="Contact"/>
    </list>
</subclass>
</class>

【问题讨论】:

    标签: java hibernate orm one-to-many hibernate-mapping


    【解决方案1】:

    我认为您应该将Contact 一对多关联移至UserProfileDO 基类:

    <hibernate-mapping    package="com.rentorama2.frontpage.client.serialize"default-lazy="false">
        <class name="UserProfileDO" table="USERPROFILE">
        <id name="oid" type="long" column="oid" >
            <generator class="increment">
                <param name="initial_value">1</param>
            </generator>
        </id>
        <discriminator column="dcolumn" type="string" length="5"/>
        <property name="acctOid">
            <column name="acctOid" />
        </property>  
        <property name="email">
            <column name="email"/>
        </property>
    
        <list name="contacts" cascade="all">
            <key column="parent_id" not-null="true"/>
            <index column="idx"/>
            <one-to-many class="Contact"/>
        </list>
    
        <subclass name="ClientProfileDO" discriminator-value="CP">
    
        </subclass> 
        <subclass name="BusinessProfileDO" discriminator-value="BP">
            <property name="b_updateAnnouncement">
                <column name="updateAnnouncement"/>
            </property>
        </subclass>
    </class>
    

    UserProfileDO 类将有一个Contact 列表:

    private List<Contact> contacts = new ArrayList<>();
    
    public List<Contact> getContacts() {
        return contacts;
    }
    
    public void getContacts(List<Contact> contacts) {
        this.contacts = contacts;
    }
    

    【讨论】:

    • 感谢您的回复。但从逻辑上和学习目的来看,为什么这是一个错误?
    • 如果没有错,为什么不在子类中声明oid、acctoid和email呢?为什么还要有 UserProfileDO? Java 继承具有开发和运行时的优势。如果你不想使用它,好吧,给你更多的力量。
    • 这不是一个错误。将通用属性移至基类是使用继承的优势之一。
    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2016-10-13
    相关资源
    最近更新 更多