当前位置: 首页 > 知识库问答 >
问题:

如何用ElementCollection替换双向OneToOne关系?

江飞章
2023-03-14

第404页的“Java持久性2.0,最终发布”有以下示例:

示例3:从一个可嵌入类到另一个实体的一对一关联。

@Entity
public class Employee {
  @Id int id;
  @Embedded LocationDetails location;
...
}

@Embeddable
public class LocationDetails {
  int officeNumber;
  @OneToOne ParkingSpot parkingSpot;
...
}

@Entity
 public class ParkingSpot {
  @Id int id;
  String garage;
  @OneToOne(mappedBy="location.parkingSpot") Employee assignedTo;
...
}

我希望员工内部有多个位置详细信息:

@Entity
public class Employee {
  @Id int id;
  @ElementCollection
  @CollectionTable(name="EMP_LOCATION") 
  Map<String, LocationDetails> locations;
...
}

如何更改实体ParkingSpot以指向集合表EMP_LOCATION内的可嵌入Location细节。

应该是

@OneToOne(mappedBy="location.parkingSpot") Employee assignedTo;

替换为@ElementCollection?

非常感谢。

共有1个答案

麻学博
2023-03-14

我在书中找到了答案:“Keith M.,Schincariol M.-Pro JPA 2,第2版(Java中的专家之声)-2013”第271页。

关于可嵌入类型的限制条件是,如果嵌入对象是元素集合的一部分,则集合中的嵌入对象只能包括外键存储在源表中的映射。它可以包含所拥有的关系,例如一对一和多对一,但不能包含外键位于目标表或联接表中的一对多或多对多关系。类似地,它不能包含其他基于集合表的映射,如元素集合。

解决方案是将Location细节作为一个实体,而不是嵌入式对象

 类似资料:
  • 问题内容: 我有2个类:User和UserPicture具有1:1的关系。 UserPicture中的“ user”将被加载,而UserPicture中的“ userPicture”则不会加载-我错了吗? 编辑 必须添加,我只是创建一个UserPicture并插入它们(使用现有的userId)-也许我需要在UserPicture中级联“ user”? 问题答案: 您必须映射您的课程。

  • 给定以下具有双向一对多关系的JPA实体 如果我从已经包含一些项目的数据库加载购物车 我想用一个新的物品集合替换购物车中的物品 执行此更换的最简单/最佳方法是什么?理想情况下,我希望生成的SQL语句合理高效,但我的主要目标是使用简洁易读的代码执行替换。 为了明确我所说的替换是什么意思,如果购物车最初包含ID为2、3、4的项目,并且包含4、5、6,那么在替换之后,购物车应该包含ID为4、5、6的项目。

  • 控制器: 存储库: 序列:

  • 问题内容: 假设我有个人 和工作 提取时,我无法将Person和Job映射到其他实体。 我在做什么错? 问题答案: 您的代码应为: (尝试从工作中删除重复的列’person_id’) 或其他共享主键的方法:

  • 我最近开始研究Hibernate,并在研究映射。在我的场景中,我有一个可以拥有多辆车的用户。在执行双向映射时,在第二个表中生成的列,因为如果使用此双向映射,我将获得空值。我试过调试,但没用。 用户etails.java 交通工具Java语言 冬眠之石。Java语言 输出: 我也发现这有点难以理解为什么我们应该选择双向而不是单向映射。

  • 我定义了具有@OneToOne双向关系的实体。 关系的所有者站点(子类): 其他站点(父类): 当我试图坚持有子集的父母(不坚持),然后我得到了例外 TransientPropertyValueException:对象引用未保存的临时实例-在刷新之前保存临时实例 这看起来可以理解。 但当我定义具有双向一对一/多对一关联的实体时,如: 此关系的所有者站点: 关系的另一面: 并尝试持久化具有子集合集(