我面临着一种典型的问题。想象一下对象之间典型的1-N关系。确切地说,用户(U)和房间(R):[U]*---1[R]。
问题来了,Room应该是一个抽象基类,例如BlueRoom、RedRoom。如何在用户实体中正确设置关系?
public interface Room { ... }
@MappedSuperclass
public abstract class RoomSuperclass implements Room { ... }
@Entity
public class BlueRoom extends RoomSuperclass { ... }
@Entity
public class RedRoom extends RoomSuperclass { ... }
@Entity
public class User {
@ManyToOne(targetEntity = ???) // I don't know if it will be BlueRoom or RedRoom
private Room room; // ManyToOne cannot be applied on mapped superclass
}
我知道这可能可以通过在RoomSuperclass上使用@Entity而不是@MappedSuperclass来解决,但我不确定这是否是一个好的解决方案,是否有更好的解决方案。
用MappedSuperclass
注释的超类不应该用Entity
注释。
关系注释只能与用Entity
注释的类一起使用。
您可以用Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
替换MappedSuperclass
注释,并将Entity
注释添加到您的超类中。
通过这种方式hibernate将为每个类创建一个数据库表。你可以在官方文档中查看其他策略。
已加入一种策略,其中特定于子类的字段被映射到一个独立的表,而不是父类的公共字段,并执行连接来实例化子类。
SINGLE_TABLE每个类层次结构的单个表。
表_类每个具体实体类的表。
根据帖子下面的评论。将超类声明为@Entity是解决方案。