Hibernate一对一(在外键上)与一对一(在主键上)

时间:2012-12-14 10:59:07

标签: hibernate foreign-keys primary-key one-to-one

我有关于的问题 在主键上使用one-to-one关联或在主键上使用one-to-one关联有什么好处?

我已在http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html#assoc-unidirectional-121

阅读了Hibernate的文档

有人可以告诉我使用第一次或第二次实施的详细信息吗?

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

在这种关联中,当一个实体与另一个实体中的一个实体相关时,会发生一对一的关系。

这里是链接,例如:           primary key association

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

在同一示例中,请执行以下更改:

在StockDetail.java

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

in stock.hbm.xml

    <id name="stockId" type="java.lang.Integer">
                <column name="STOCK_ID" />
                <generator class="assigned" />
      </id>
in 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>