Java 泛型类中的hibernate继承
我有一个泛型类,它是一些非泛型类的super类,它们只是设置它的泛型参数,如下所示:Java 泛型类中的hibernate继承,java,hibernate,generics,inheritance,Java,Hibernate,Generics,Inheritance,我有一个泛型类,它是一些非泛型类的super类,它们只是设置它的泛型参数,如下所示: @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) class A<T>{ @Id getId(){..} setID(int id){..} int id T t; T getT(){...} setT(T t){...} } 继承(策略=InheritanceType.TAB
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
class A<T>{
@Id
getId(){..}
setID(int id){..}
int id
T t;
T getT(){...}
setT(T t){...}
}
继承(策略=InheritanceType.TABLE每类)
甲级{
@身份证
getId(){..}
setID(int-id){..}
整数id
T;
T getT(){…}
setT(T){…}
}
及
@实体
类B扩展了{}
但是hibernate说B没有标识符,我该怎么办?您还需要将@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){...}
}
@实体
@继承(策略=继承类型。每个类的表)
甲级{
@身份证
getId(){..}
setID(int-id){..}
整数id
@短暂的
T;
T getT(){…}
setT(T){…}
}
如果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){...}
}
@MappedSuperclass
@继承(策略=继承类型。每个类的表)
甲级{
@身份证
getId(){..}
setID(int-id){..}
整数id
T;
T getT(){…}
setT(T){…}
}
我同意第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){...}
}
@MappedSuperclass
@继承(策略=继承类型。每个类的表)
抽象A类{
@身份证
getId(){..}
setID(int-id){..}
整数id
T;
T getT(){…}
setT(T){…}
}
每类表策略通常需要这种抽象基。
然后子类指定表名和其他字段
@Entity
@Table(name="MY_INTEGERS")
class B extends A<Integer>{}
@实体
@表(name=“MY_INTEGERS”)
类B扩展了{}
(就我个人而言,我会将此变量类型移动到子类中,但我不知道您想要实现什么)。经过大量测试,试图让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;
[...]
}
它们在同一个包中,在我的真实代码中它们也是公共的。但是我想我应该做一些注释,让hibernate理解它!现在我得到了这个错误:A有一个未绑定的类型,并且没有显式的目标实体。解决此通用用法问题或设置显式目标属性(例如@OneToMany(target=),或使用显式@TypeTry将@Transient添加到t属性
@Entity
@DiscriminatorValue=("C")
public class ClassC extends ClassA {
@OneToOne
@JoinColumn(name = "mycolumn_id")
private String instance;
[...]
}