0

我有一个泛型类,它是一些非泛型类的超级类,那些只是设置它的泛型参数,如下所示:

@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

4 回答 4

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){...}
}
于 2012-10-22T15:56:58.200 回答
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){...}
}
于 2012-10-22T18:01:27.530 回答
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>{}

(我个人会将这个变量类型移动到子类中,但我不知道你想要实现什么)。

于 2015-05-21T13:40:36.120 回答
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;

  [...]
}
于 2015-05-22T09:04:39.907 回答