我有一个实体Person,它是另外两个实体的父级:Caller和Employee。这些实体使用具有鉴别器列的SINGE_TABLE策略实现:person_id
我还有另一个实体:与Person具有ManyToMany关系的位置。因此,一个人可能属于多个地点,一个地点可能有多个人
使用manyToMany很容易映射Location和Person,但现在我需要一种映射子实体的方法,因为在位置我需要一些方法,如:getEmployees();和getCallers();
我尝试过类似的东西:
public class Location implements Serializable, Comparable<Location> {
private static final long serialVersionUID = 1L;
@ManyToMany(mappedBy="locations")
private List<Caller> callers = new ArrayList<Caller>();
@ManyToMany(mappedBy="locations")
private List<Employee> employees = new ArrayList<Employee>();
}
@Entity
@DiscriminatorValue("0")
@Access(AccessType.FIELD)
public class Caller extends Person {
private static final long serialVersionUID = 1L;
@Column(name = "company_name")
private String companyName;
@Column(name = "individual")
private Boolean individual;
}
@Entity
@Access(AccessType.FIELD)
@DiscriminatorValue("1")
public class Employee extends Person {
private static final long serialVersionUID = 7526471155622776147L;
}
@Entity
@Access(AccessType.FIELD)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="person_type",discriminatorType=DiscriminatorType.INTEGER)
@Table(name="persons")
public class Person implements Serializable, Comparable<Person>{
private static final long serialVersionUID = 7526471155622776147L;
@ManyToMany
@JoinTable(name="persons_locations",
joinColumns={@JoinColumn(name="person_id")},
inverseJoinColumns={@JoinColumn(name="location_id")})
private List<Location> locations;
}
但是当我尝试编译应用程序时出现此错误:
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: xxx.entities.yyy.Caller.locations in xxx.vs.entities.yyy.Location.callers.
我想一个解决方案是将位置移动到子节点,但是在所有Location都是普通人的属性后,我将不得不复制/粘贴一些代码。
处理这类问题的正确方法是什么?
答案 0 :(得分:0)
你尝试过的东西不起作用。如果您在呼叫者和位置之间存在关联,则必须在呼叫者中定义关联,而不是在人员中。员工也一样。而我认为你也需要两个不同的连接表。