Java 泛型类中的hibernate继承

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

我有一个泛型类,它是一些非泛型类的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.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;

  [...]
}