与同一实体类型和表的多个一对多关系?

时间:2015-08-19 23:28:45

标签: mysql hibernate jpa

我有一个有趣的用例,我希望Hibernate能够管理多个一对多关系到同一个实体类型。

例如: BookShelf 小说书籍书籍的关系,还有 BookShelf 非小说类书籍映射到预订(s)。 Hibernate映射看起来像这样:

<class name="com.example.BookStore" table="BOOK_SHELF">
    <id name="id" type="long" column="bookShelfId">
        <generator class="native" />
    </id>
    <set name="fictionBooks" table="SHELF_BOOK" cascade="all-delete-orphan" lazy="false">
        <key column="bookShelfId" />
        <one-to-many class="com.example.Book" />
    </set>
    <set name="nonFictionBooks" table="SHELF_BOOK" cascade="all-delete-orphan" lazy="false">
        <key column="bookShelfId" />
        <one-to-many class="com.example.Book" />
    </set>
</class>
<class name="com.example.Book" table="SHELF_BOOK">
    <id name="id" type="long" column="shelfBookId">
        <generator class="native" />
    </id>
    <property name="name" not-null="true" unique="true"/>
</class>

关系所有者 BookShelf 是否有办法指定一些可用于区分小说和非小说类书籍的鉴别器值?如果可能,鉴别器将作为附加列存储在 SHELF_BOOK 表中,Hibernate会自动对其进行过滤。

有没有办法在不借助多对多关联或使用表每类策略扩展 Book 实体的情况下执行此操作< / em>的

2 个答案:

答案 0 :(得分:2)

理想情况下,您应该拥有&#34;类型&#34;或&#34; flag&#34; SHELF_BOOK表中的列表示该书是虚构的或非虚构的。

假设您已添加此&#34;键入&#34;列,那么我认为你可以在集合中指定一个过滤语句:

<set name="fictionBooks" table="SHELF_BOOK" cascade="all-delete-orphan"   lazy="false">
    <filter name="myfilter" condition=":type = 'FICTION'"/>
    <key column="bookShelfId" />
    <one-to-many class="com.example.Book" />
</set>

您可以参考http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-filters

答案 1 :(得分:1)

根据您发布的内容,我可以说,为了达到您想要的效果,您需要修改您的关系所有者 BookShelf 以仅存储对预订的引用并添加属性,例如 bookType ,指向预订实体。

for i = len(alpha)
     [theta, J_vals] = gradientDescent(..., alpha(i),...);
     J(i) = J_vals;
end

通过查看 BookShelf 实体,您无法通过其他方式(ManytoMany除外)查找书籍类型。您还可以使用单表策略,它会自动将鉴别器添加到插入的值中,但为了做到这一点,您需要为 FictionalBook NonFictionalBook 创建两个单独的类。 / p>