"Java Persistence 2.0, Final Release"在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;
...
}
我想有多个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取代?
谢谢!
我在书中找到了答案:"Keith M., Schincariol M. - Pro JPA 2, 2nd Edition (the Expert's Voice in Java) - 2013" 271页。
关于可嵌入类型的一个附带条件是,如果嵌入对象是元素集合的一部分,然后是对象中的嵌入对象collection 只能包含存储外键的映射在源表中它可以包含已拥有的关系,例如一对一和多对一,但不能包含一对多或多对多关系,其中外键在目标表或连接表。同样,它也不能包含其它基于集合表的映射,如元素集合。
解决方案是将LocationDetails作为实体,而不是嵌入对象。