【发布时间】:2014-05-01 23:03:09
【问题描述】:
首先,我想说的是,我已经阅读了数十篇关于使用 hibernate 进行继承映射或多态获取的文章,但没有找到解决问题的方法。 虽然情况很简单。
执行以下代码时: 列出餐点 = sessionFactory.getCurrentSession() .createQuery("select m from Meal m").list(); 我收到以下错误: org.hibernate.WrongClassException:ID 为 1 的对象不属于指定的子类:com.myPack.Fruit(鉴别器:橙色)
实际上,我看不懂 Orange 或 Apple 中的抽象类fruit
一餐包含水果,可以是橙子或苹果
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "fruit")
public abstract class Fruit {
@Id
@GeneratedValue
@Column(name = "id", unique = true)
private Integer id;
}
@Entity(name = "Orange") //this is the discriminatorValue stored in dtype column
public class Orange extends Fruit {
}
@Entity(name = "Apple") //this is the discriminatorValue stored in dtype column
public class Orange extends Fruit {
}
@Entity
@Table(name = "meal")
public class Meal {
...
@ManyToOne
@JoinColumn(name = "fruit_id", nullable = false)
private Fruit fruit = null;
}
获取不是 LAZY,所以我不应该对代理有任何问题。 我不明白为什么休眠无法发现这样的水果是橙子或苹果,因为水果表在 DTYPE 列中包含鉴别器橙子或苹果
如果能解决这个问题,我将不胜感激。 (对不起我含糊的英语)
。 .
经过进一步研究,我发现@DiscriminatorOptions(force = true) 可以解决我的问题,但最终……无奈。 我了解到的是,即使 hibernate 拥有所有信息来查找具体类,在某些情况下也需要像 @DiscriminatorOptions(force = true) 这样的注释。 无论如何,我想告诉休眠:“嘿休眠不要尝试实例化抽象水果类,因为它是抽象的。嘿休眠尝试依赖设置了@DiscriminatorValue 的实体”..但是休眠是聋的:(
【问题讨论】:
标签: hibernate inheritance polymorphism hql subclass