2

我对使用外键关联或主键关联有
什么好处有疑问? one-to-oneone-to-one

我已经阅读了 Hibernate 的文档:http: //docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html#assoc-unidirectional-121

有人可以详细告诉我使用第一个或第二个实现的优点吗?

另一个问题,我在用户和周界之间有one-to-one单向关系。
(用户---->周界)我想使用基于外键的关联。
我可以将方向反转为 (User <---- Perimeter) 以使表格 User 保持不变吗?
我认为这是不合理的(perimeter.getUser() !!!)但它在技术上是可能的吗?

4

3 回答 3

3

除了 JB Nizet 提到的优点之外,感谢另一个人告诉我,基于外键的一对一更加灵活。让我们考虑一下我在外键(用户 <--- 周界)上使用一对一,如果应用程序的要求更改为任何周界需要多个用户,如果我共享主键,我会有很多更多的重构要做。但是当我使用外键时,我所做的就是放松唯一约束;)

于 2012-12-18T22:25:07.150 回答
3

我看到两个优点

  • 有了选择权,您就可以映射现有模式,无论他们选择什么作为策略
  • 使用 A 中的外键指向 B 中的 ID,如果外键为空,Hibernate 知道给定 A 没有 B。它无法知道何时使用主键。因此,如果关联是可选的,则使用外键会更有效。

对于第二个问题,是的,当然有可能。这称为双向 OneToOne 关联:

public class User {
    // ...

    @OneToOne
    @JoinColumn
    private Perimeter perimeter;
}

public class Perimeter {
    // ...

    @OneToOne(mappedBy = "perimeter")
    private User user;
}
于 2012-12-14T11:14:04.460 回答
1

使用主键关联的一对一关系

在这种关联中,当一个实体与另一个实体中的一个事件恰好相关时,就会出现一对一的关系。

这是例如链接: 主键关联

使用外键关联的一对一关系

在同一示例中进行以下更改:

在 StockDetail.java 中

    private Integer stockDetailsId;
    //with setter and getter
    //remove stockId and it's setter and getter

在 stock.hbm.xml

    <id name="stockId" type="java.lang.Integer">
                <column name="STOCK_ID" />
                <generator class="assigned" />
      </id>

在 StockDetail.hbm.xml 中

    <id name="stockDetailsId" type="java.lang.Integer">
                <column name="STOCK_DETAILS_ID" />
                <generator class="assigned"/>
     </id>
    <many-to-one name="stock" 

    class="com.test.common.Stock" column="STOCK_ID" />

在 hibernate.cfg.xml 中

    //this is optional property if you want to create database table's according to your hbm file's.

    <property name="hibernate.hbm2ddl.auto">create</property>
于 2013-05-30T06:23:20.663 回答