我有一个泛型类,它是某些非泛型类的超类,它们只是设置它的泛型参数:
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
class A<T>{
@Id
getId(){..}
setID(int id){..}
int id
T t;
T getT(){...}
setT(T t){...}
}
和
@Entity
class B extends A<Integer>{}
但是hibernate说B没有标识符我该怎么办?
答案 0 :(得分:1)
您还需要将@Entity注释添加到A类。 属性t上的@Transient注释应该有助于您的第二个异常
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
class A<T> {
@Id
getId(){..}
setID(int id){..}
int id
@Transient
T t;
T getT(){...}
setT(T t){...}
}
答案 1 :(得分:1)
如果A不会直接持久化,但你确实希望它的子类获取一些(或全部)Hibernate注释,你应该使用@MappedSuperclass:
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
class A<T>{
@Id
getId(){..}
setID(int id){..}
int id
T t;
T getT(){...}
setT(T t){...}
}
答案 2 :(得分:0)
我同意第1号回复,使用@MappedSuperclass进行A - 不要使实体成为抽象的东西。 你应该把这个课程特别抽象化。
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
abstract class A<T>{
@Id
getId(){..}
setID(int id){..}
int id
T t;
T getT(){...}
setT(T t){...}
}
每类表策略通常需要这种抽象基础。 然后子类指定表名和其他字段。
@Entity
@Table(name="MY_INTEGERS")
class B extends A<Integer>{}
(我个人会把这个变量类型移到子类中,但我不知道你想要实现什么)。
答案 3 :(得分:0)
经过大量测试,试图让Java参数化与抽象父(单表继承)和抽象子表(每表一个表继承)一起工作,我放弃了。
这可能是可能的,但是在Hibernate尝试将抽象(参数化)类实例化为实体时,通常会遇到问题。这是当您收到错误“A具有未绑定类型且没有显式目标实体”时。 这意味着Hibernate没有参数化类型的参数值。 我发现扩展类的测试很好,但是围绕父实体的测试会中断。
我建议使用JPA继承重写它,将参数化的东西移动到扩展类中。这样,您就可以从数据库中获得相同的多态性。
@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "CLASS_TYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class ClassA {
[...]
}
分机B:
@Entity
@DiscriminatorValue=("B")
public class ClassB extends ClassA {
@OneToOne
@JoinColumn(name = "mycolumn_id")
private Integer instance;
[...]
}
扩展名C:
@Entity
@DiscriminatorValue=("C")
public class ClassC extends ClassA {
@OneToOne
@JoinColumn(name = "mycolumn_id")
private String instance;
[...]
}