使用@MappedSuperClass祖先的Hibernate映射泛型类

时间:2013-12-11 20:59:13

标签: java hibernate spring-mvc jpa-2.0

我遇到了一个问题,我不知道,是否有可能解决它。让我告诉你我的代码并解释一下情况。我有一个抽象类User映射为超类。

@MappedSuperclass
public abstract class User extends AbstractEntity {                     
}

然后我有两个类PersonCompany,扩展了超类。

@Entity
public class Person extends User {
}

@Entity
public class Company extends User {
}

由于这一切,一切都很好。我有两个表由实体名称调用,它的工作正常。但是,我有一个名为Invoice的实体,我必须将PersonCompany映射到其中。

@Entity
public class Invoice extends AbstractEntity {

    @ManyToOne()
    @JoinColumn(name="user_id", updatable=false)
    private Class<? extends User> user;
}

问题在于我不知道User的哪个实现将映射到此Invoice实体。有了这个解决方案,Hibernate给了我一个错误org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.xxx.user references an unknown entity: java.lang.Class 我明白了,但请问,有没有办法实现这种行为,没有例外?或者我完全错了,在ORM中也没有类似的东西?

我无法使用private User user因为User@MappedSuperclass,而不是@Entity

谢谢!

2 个答案:

答案 0 :(得分:2)

为什么不使用类型User

,而不是使用下限
@Entity
public class Invoice extends AbstractEntity {

    @ManyToOne()
    @JoinColumn(name="user_id", updatable=false)
    private User user;
}

像这样,您仍然可以将任何扩展自User类的类作为前一个声明。但是,这不起作用,因为User不是Entity

如果您将User声明为实体,但将继承策略设置为TABLE_PER_CLASS,则应该可以。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class User extends AbstractEntity {                     
}

答案 1 :(得分:0)

Hibernate在运行时不会看到通用的“User”(类型擦除)。

使用User代替Class<? extends User>

请注意,即使Hibernate 可以看到通用类型,您仍然有一个用户Class而不是User ...