java - Hibernate 是否支持作为 pkey 的一对一关联?

标签 java hibernate orm entity-relationship

谁能告诉我 Hibernate 是否支持关联作为实体的 pkey?我认为这会得到支持,但我很难让代表它的任何类型的映射正常工作。特别是,使用下面的直接映射:

@Entity
public class EntityBar
{
    @Id
    @OneToOne(optional = false, mappedBy = "bar")
    EntityFoo foo

    // other stuff
}

我得到一个 org.hibernate.MappingException:“无法确定类型:EntityFoo,表:ENTITY_BAR,列:[org.hibernate.mapping.Column(foo)]”

深入研究代码,ID 似乎始终被视为值类型;即“任何按值而不是按引用保存的东西。它本质上是一个 Hibernate 类型,以及零个或多个列。”我可以通过声明它可序列化来使我的 EntityFoo 成为值类型,但我也不希望这会导致正确的结果。

我原以为 Hibernate 会认为列的类型是整数(或者父 ID 的实际类型是什么),就像正常的一对一链接一样,但这不是'当我也声明它是一个 ID 时,它似乎不会起作用。通过尝试将@OneToOne 与@Id 结合起来,我是否超越了可能?如果是这样,如何合理地模拟这种关系?

最佳答案

如果目标是拥有一个共享主键,那么这个呢(受Java Persistence With Hibernate 示例启发并在宠物数据库上测试):

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;

    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private Address shippingAddress;

    //...
}

这是首先插入并获得生成的 ID 的“父”类。 地址 如下所示:

@Entity
public class Address implements Serializable {
    @Id @GeneratedValue(generator = "myForeignGenerator")
    @org.hibernate.annotations.GenericGenerator(
        name = "myForeignGenerator",
        strategy = "foreign",
        parameters = @Parameter(name = "property", value = "user")
    )
    @Column(name = "ADDRESS_ID")
    private Long id;

    @OneToOne(mappedBy="shippingAddress")
    @PrimaryKeyJoinColumn
    User user;

    //...
}

对于上述实体,以下行为似乎符合预期:

User newUser = new User();
Address shippingAddress = new Address();
newUser.setShippingAddress(shippingAddress);
shippingAddress.setUser(newUser);            // Bidirectional
session.save(newUser);

保存Address 时,插入的主键值与user< 引用的User 实例的主键值相同 属性。

加载用户地址也可以。

如果我遗漏了什么,请告诉我。


PS:严格回答问题,根据Primary Keys through OneToOne Relationships :

JPA 1.0 does not allow @Id on a OneToOne or ManyToOne, but JPA 2.0 does.

但是,Hibernate 的 JPA 1.0 兼容版本

allows the @Id annotation to be used on a OneToOne or ManyToOne mapping*.

虽然我无法让它与 Hibernate EM 3.4 一起工作(它与 Hibernate EM 3.5.1 一起工作,即 JPA 2.0 实现)。也许我做错了什么。

无论如何,使用共享主键似乎提供了一个有效的解决方案。

关于java - Hibernate 是否支持作为 pkey 的一对一关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2638248/

相关文章:

java - 如何从嵌套的 Jar 中提取 .class 文件?

java - JPA/Hibernate 中的单独表与额外列

php - PHP 中的 ORM 和 DAO

java - 使用 JDBC 访问 Hive 元数据

java - 从txt文件中搜索特定字符(Java)

java - 为什么 hibernate 一段时间后停止工作?

java - 在 JPQL 查询中使用数组

mysql - 使用 Doctrine 保存行时 Doctrine_Connection_Mysql_Exception

sql - Django:如何有效地将 select_lated() 与 Paginator 一起使用?

java - 是否可以使用 getClic() 来获取 X() ?