我在Java Hibernate项目中有以下类:
@Entitiy
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class ClassA<T extends ClassB>{
@OneToOne
@JoinColumn(name = "mycolumn_id")
private T instance;
[...]
}
@Entitiy
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class ClassB{
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Integer id;
[...]
}
当我尝试创建/保存ClassA的实例(使用继承ClassB的类的实例)时,我得到以下异常:
org.hibernate.AnnotationException: Property ClassA.instance has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type
我无法在ClassA中为“T实例”设置显式目标,因为ClassB是抽象的,文字“T.class”无效。但是通用用法是必要的,因为我必须在ClassA中保存许多不同类型的ClassB。
我该如何解决这个问题?
答案 0 :(得分:1)
经过大量测试,试图让Java参数化与抽象父(单表继承)和抽象子表(每表一个表继承)一起工作,我放弃了。
这可能是有可能的,但是在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;
[...]
}
答案 1 :(得分:0)
此错误来自于hibernate尝试从抽象类创建实体(指定为“abstract”或使用Java参数)。
您需要创建一个抽象基类,它不是一个实体,然后针对特定类型进行扩展。您的子类型可以添加可在表中为空的列,和/或指定参数。
@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TRACK_TYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class ClassA<T extends ClassB>{
@OneToOne
@JoinColumn(name = "mycolumn_id")
private T instance;
[...]
}
您还需要确定ClassB是否正在扩展ClassA,还是一个相关的表。您不能让B扩展A,但使用不同的继承类型。 假设单表:
@Entity
@DiscriminatorValue=("B")
public class ClassB extends ClassA<Integer>{
[...]
}