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

时间:2015-08-11 11:09:43

标签: java-ee jpa embeddable

" Java Persistence 2.0,最终版本"第404页上有以下示例:

示例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;
...
}

我想在Employee中有多个LocationDetails:

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

如何更改实体ParkingSpot以指向集合表EMP_LOCATION中的可嵌入LocationDetails。

应该是

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

被@ElementCollection取代?

谢谢!

1 个答案:

答案 0 :(得分:1)

我在书中找到了答案:“Keith M., Schincariol M. - Pro JPA 2, 2nd Edition (The Expert's Voice in Java) - 2013”第271页。

  

关于可嵌入类型的附带条件是,如果嵌入对象是一个   元素集合的一部分,然后是嵌入的对象   集合只能包含存储外键的映射   在源表中。它可以包含所拥有的关系,例如   一对一和多对一,但它不能包含一对多或多对一   外键在其中的多对多关系   目标表或连接表。同样,它不能包含其他   基于集合表的映射,如元素集合。

解决方案是将LocationDetails作为实体,而不是嵌入对象。