泛型类中的hibernate继承

时间:2012-10-22 15:49:42

标签: java hibernate generics inheritance

我有一个泛型类,它是某些非泛型类的超类,它们只是设置它的泛型参数:

@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没有标识符我该怎么办?

4 个答案:

答案 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;

  [...]
}