这是我的模特课:
@Entity
@Table(name = "item")
public class Item{
@Id
@Column(name = "id")
@GeneratedValue
private int id;
@Column(name="value")
private int value;
@Column(name = "type")
private int type;
//getters and setters...
}
当我使用Hibernate获取id为1(示例)的项目时,我想检查它是什么类型并将其转换为另一个扩展Item的类。我怎样才能做到这一点? 例如:
Item i = (Item) session.get(Item.class, 1);
if(i.getType == 1) {
i = (Box) i; //This throw me an error
}
我也可以new Box()
,但后来我丢失了Item i
的所有数据;
答案 0 :(得分:0)
这与Hibernate没什么关系。
Item的实例不是,也绝不会是Box的实例,无论你是否强制转换,除非Box扩展Item并且Item实例已经是Box的实例。就像,无论你做什么,狗永远不会是一辆车。车辆可以是汽车,如果是,则可以将车辆投入汽车而不会出现异常。
实现一个Box构造函数,它将Item作为参数并将其包装,或将其所有数据复制到Box的属性。
这是一个基本的OO问题,坦率地说,你应该在触及Hibernate之前了解对象和类的基础知识,Hibernate是一个非常复杂的野兽。
答案 1 :(得分:0)
好问题!您可以使用InheritanceType.JOINED策略,而hibernate将为您完成所有操作。我想Box
类继承自Item
。但要注意这一点:在分支4.2.x中,如果你使用的复杂数据库模式有超过100个链接表(例如),hibernate会产生很多外连接的可怕查询。它在分支4.3.x(我想)中得到了解决。看看link我们遇到了这样的问题并且无法做任何事情,因为由于weblogic 12c的限制而无法迁移到新版本的hibernate。