我有这个类
interface UserInterface
然后
abstract class user implements UserInterface
然后我有两个孩子班
Class Teacher extends User
Class Parent extends User
现在在数据库中,我有三张表
user table with id,password
teacher with FK and other stuff
parent with FK and other stuff
现在我正在使用User类检查登录。
我的问题是,如果Employee登录,那么内存中的对象将是User类型。然后我如何获得Employee对象
我的模式错了吗?我需要采取不同的方式吗?
假设Employee是User的第三个子类,那么如果用户登录,并且您使用Hibernate从数据库中获取该用户,并且该用户实际上是一名员工,那么Hibernate将返回一个Employees实例。正如你所期望的那样。
如果没有,那么你做错了什么,但如果没有看到代码,就无法判断。
如果您向hibernate请求类型为User
的对象,那么最终总是会得到UserEnhancedByCGLib
(或类似的对象)。你不能(原则上)把那个降为Teacher
或Parent
。
你有两个选择来解决这个问题。
1) 在登录时,您知道用户实际上是教师/家长,而不是最初要求hibernate为教师/家长对象而不是用户对象。
2) 您在登录时并不知道,但您必须使用User对象,并在实际需要教师/家长的专业化后对数据库进行第二次查询。
第二个方法是:
public Object refresh(Object object) {
if (object != null) {
if (object instanceof HibernateProxy) {
return ((HibernateProxy) object).getHibernateLazyInitializer().getImplementation();
}
}
return object;
}
它将(如果内存可用的话)给你一个具体的类,但却是一个分离的对象。