Hibernate在另一个字段上映射而不是PK

时间:2016-06-20 12:43:40

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

我现在卡住了一会儿,我需要一些帮助。

我想要在两个表中任何一个都不是PK的两个字段之间进行休眠映射

Table Category (
   catId   Numeric(10),
   categoryBusinessRef  Numeric(10)
)


Table Product (
   productId    Numeric(10),
   categoryBusinessRef  Numeric(10)
)

Sql查询将是:

SELECT * 
   from Category  as a 
   Join Product  as b on a.categoryBusinessRef = b.categoryBusinessRef  

但是在Hibernate中它使我成为了这个映射

SELECT * 
   from Category  as a 
   Join Product  as b on a.categoryId = b.categoryBusinessRef

我的朋友看起来很喜欢

<class name="Category" table="A">
        <id name="categoryId" length="10">
            <column name="categoryid" />
            <generator class="sequence">
                <param name="sequence">S_category</param>
            </generator>
        </id>
        <set  name="categoryBusinessRefs" table="B" >
            <key>
                <column name="categoryBusinessRef" />
            </key>
            <one-to-many class="ProductClass" />
        </set>
</class>

<class name="Product" table="B">
        <id name="productId" length="10">
            <column name="productid" />
            <generator class="sequence">
                <param name="sequence">S_product</param>
            </generator>
        </id>
        <property name="categoryBusinessRef" length="10">
            <column name="categoryBusinessRef" />
        </property>
</class>

所以它是一对多的关系,但它必须与另一个值映射为类别的PK

感谢您的帮助

编辑:

如果我不能那样做的话!但是,如果我能够这样做,我知道主键的所有内容,但我的问题不是&#34;在Hibernate上映射PK&#34;但是&#34;在Hibernate中映射到另一个字段而不是PK&#34;,所以说地图到PK的答案对我不感兴趣:p

1 个答案:

答案 0 :(得分:1)

你的模型是错误的,除非你想要一个笛卡尔积(这是一个罕见的要求),你应该总是用主键加入。

您可以拥有一对一,一对多或多对多的关系(最后两种更为常见)。

在一对多中,您需要onemany方的pk。

在许多人中,你需要一个能够进行映射的关系表。

假设您希望许多B连接到同一A(所以一对多)。

CREATE TABLE a (
  id   NUMERIC(10) PRIMARY KEY,
  disc NUMERIC(10) NOT NULL
)

CREATE TABLE b (
  id    NUMERIC(10) PRIMARY KEY,
  a_id  NUMERIC(10) NOT NUL REFERENCES a (id)
)

现在您可以查询

SELECT * 
FROM a 
JOIN b ON b.a_id = a.id

并从a中恢复所有光盘,并与所有b保持适当的关系。