Java 使用“多个多个关系”;mappedBy“;超级级成员
我正在使用Hibernate开发一个应用程序,并尝试对以下场景进行建模: 我有一个活动抽象类,定义如下: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
@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注释,不是JPAPerfect-我刚刚编辑了我的原始帖子,并问了一个问题,这是否有效,谢谢!(将测试然后接受)好的,我试过了,我得到了一个错误: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>();