使用“mappedBy”与Super类成员的多个ManyToMany关系

时间:2011-07-20 16:13:54

标签: java hibernate inheritance one-to-many

我正在使用Hibernate开发一个应用程序,并试图模拟以下场景:

我有一个Activity Abstract类,定义如下:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="activityType")
@Table(name = "BF_ACTIVITY")
public abstract class Activity extends PersistableObject {

    @ManyToOne
    @JoinColumn(name = "ASSIGNED_TO")
    protected  Contactable assignedTo;

    @ManyToOne
    @JoinColumn(name = "RAISED_BY")
    protected  Contactable raisedBy;

注意我正在使用单表继承(因此所有实现对象将使用相同的表)并设置了DiscriminatorColumn。

现在我有两个扩展Activity:ToDo和Status:

的对象
@Entity
@Table(name = "BF_TODO")
@DiscriminatorValue("Todo")
public class ToDo extends Activity {
...


@Entity
@Table(name = "BF_STATUS")
@DiscriminatorValue("Status")
public class Status extends Activity {
...

再次注意,对于这两种实现,我都设置了DiscriminatorValue。

最后,我想要一个Person对象,这个人可以有一个Status列表和一个ToDo列表 - 我也想捕获双向关系,所以我使用mappedBy配置建模它,但是两种情况都使用超级类“Activity”中存在的“raisedBy”字段:

public abstract class Person {

    @ManyToMany(mappedBy="raisedBy", targetEntity=Activity.class)
    private List<ToDo> todoItems = new ArrayList<ToDo>();

当我使用来自超类的成员变量“raisedBy”的mappedBy时,我也指定了targetEntity(否则它无法在ToDo对象中找到该字段)。

问题是当我尝试调用getTodoItems()时 - 它实际上只是将“raiseBy”链接的所有“Activity”对象返回给当前人。例如它抛出一个强制转换异常,因为它期望ToDos列表,但Hibernate也在列表中返回Status对象。

我希望mappedBy配置和DiscriminatorValue足以让这项工作 - 有没有人遇到过这个或解决过它?

由于


修改

我刚发现这篇文章:

有人能指出我在一个好的@Where概述和例子的方向吗?我可以像以下一样更新我的人,使用@Where和鉴别器列吗?

public abstract class Person {

    @ManyToMany(mappedBy="raisedBy", targetEntity=Activity.class)
    @Where(clause="activityType=Todo")
    private List<ToDo> todoItems = new ArrayList<ToDo>();

1 个答案:

答案 0 :(得分:2)

添加注释: @Where(clause =“activityType ='Todo'”)

但它是一个hibernate注释,而不是JPA