Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用“多个多个关系”;mappedBy“;超级级成员_Java_Hibernate_Inheritance_One To Many - Fatal编程技术网

Java 使用“多个多个关系”;mappedBy“;超级级成员

Java 使用“多个多个关系”;mappedBy“;超级级成员,java,hibernate,inheritance,one-to-many,Java,Hibernate,Inheritance,One To Many,我正在使用Hibernate开发一个应用程序,并尝试对以下场景进行建模: 我有一个活动抽象类,定义如下: @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="activityType") @Table(name = "BF_ACTIVITY") public abstract class Activity extends PersistableObject { @M

我正在使用Hibernate开发一个应用程序,并尝试对以下场景进行建模:

我有一个活动抽象类,定义如下:

@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

现在我有两个扩展活动的对象: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对象,Person可以有一个状态列表和一个ToDo列表-我还希望捕获双向关系,因此我使用mappedBy配置对其进行建模,但在这两种情况下都使用存在于超类“Activity”中的“raisedBy”字段:

公共抽象类人物{
@ManyToMany(mappedBy=“raisedBy”,targetEntity=Activity.class)
private List todoItems=new ArrayList();
当我将mappedBy与来自超类的成员变量“raisedBy”一起使用时,我还指定了targetEntity(否则它无法在ToDo对象中找到字段)

问题是,当我尝试调用getTodoItems()时,它实际上只是将所有由“raisedBy”链接的“活动”对象返回给当前人员。例如,它抛出强制转换异常,因为它需要TODO列表,但Hibernate也返回列表中的状态对象

我希望mappedBy配置和DiscriminatorValue足以实现这一点——有人遇到过或解决过这个问题吗

谢谢


编辑

我刚找到这篇文章:

有人能给我指出一个好的@Where概述和示例的方向吗?我能更新我的人,如下使用@Where和discriminator列吗

public abstract class Person {

    @ManyToMany(mappedBy="raisedBy", targetEntity=Activity.class)
    @Where(clause="activityType=Todo")
    private List<ToDo> todoItems = new ArrayList<ToDo>();
公共抽象类人物{
@ManyToMany(mappedBy=“raisedBy”,targetEntity=Activity.class)
@其中(子句=“活动类型=Todo”)
private List todoItems=new ArrayList();
添加注释: @其中(子句=“activityType=‘Todo’)


但这是一个hibernate注释,不是JPA

Perfect-我刚刚编辑了我的原始帖子,并问了一个问题,这是否有效,谢谢!(将测试然后接受)好的,我试过了,我得到了一个错误:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:where子句中的未知列“statuses0.activityType”-我假设这与在超类中定义的activityType有关?我是否需要像使用mappedBy配置那样执行targetEntity操作?其他e是您的表的一个问题。如果策略是SingleTable,为什么Todo和Status是表名?对此也不高兴-仍然声称activityType是未知列。还有其他想法吗?谢谢,它正在工作-有趣的是,尽管我将Discriminator列定义为“activityType”,Hibernate/Mysql将列创建为“activity_type”,因此只需调整my Where子句以使用该列名称。
public abstract class Person {

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