如何在java中从父类对象加载子对象



我有这个类

interface UserInterface

然后

abstract class user implements UserInterface

然后我有两个孩子班

Class Teacher extends User

Class Parent extends User

现在在数据库中,我有三张表

  1. user table with id,password
  2. teacher with FK and other stuff
  3. parent with FK and other stuff

现在我正在使用User类检查登录。

我的问题是,如果Employee登录,那么内存中的对象将是User类型。然后我如何获得Employee对象

我的模式错了吗?我需要采取不同的方式吗?

假设Employee是User的第三个子类,那么如果用户登录,并且您使用Hibernate从数据库中获取该用户,并且该用户实际上是一名员工,那么Hibernate将返回一个Employees实例。正如你所期望的那样。

如果没有,那么你做错了什么,但如果没有看到代码,就无法判断。

如果您向hibernate请求类型为User的对象,那么最终总是会得到UserEnhancedByCGLib(或类似的对象)。你不能(原则上)把那个降为TeacherParent

你有两个选择来解决这个问题。

1) 在登录时,您知道用户实际上是教师/家长,而不是最初要求hibernate为教师/家长对象而不是用户对象。

2) 您在登录时并不知道,但您必须使用User对象,并在实际需要教师/家长的专业化后对数据库进行第二次查询。

第二个方法是:

public Object refresh(Object object) {
    if (object != null) {
        if (object instanceof HibernateProxy) {
            return ((HibernateProxy) object).getHibernateLazyInitializer().getImplementation();
        }
    }
    return object;
}

它将(如果内存可用的话)给你一个具体的类,但却是一个分离的对象。

最新更新