jpa协会儿童实体

时间:2012-07-11 07:43:42

标签: hibernate jpa jpa-2.0

我有一个实体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都是普通人的属性后,我将不得不复制/粘贴一些代码。

处理这类问题的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

你尝试过的东西不起作用。如果您在呼叫者和位置之间存在关联,则必须在呼叫者中定义关联,而不是在人员中。员工也一样。而我认为你也需要两个不同的连接表。