gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:31 26 4
gpt4 key购买 nike

谁能告诉我 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com