我遇到了一个问题,我不知道,是否有可能解决它。让我告诉你我的代码并解释一下情况。我有一个抽象类User
映射为超类。
@MappedSuperclass
public abstract class User extends AbstractEntity {
}
然后我有两个类Person
和Company
,扩展了超类。
@Entity
public class Person extends User {
}
@Entity
public class Company extends User {
}
由于这一切,一切都很好。我有两个表由实体名称调用,它的工作正常。但是,我有一个名为Invoice
的实体,我必须将Person
或Company
映射到其中。
@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
。
谢谢!
答案 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
...