如何使用通用类型为Hibernate集合添加注释?

4
我有一个类型为List< GenericType < T > >的一对多类成员。在Hibernate中,建议如何注释此成员?
详细信息如下:
@Entity
public class DvOrdered extends DataValue
{
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name="dv_ordered_other_reference_ranges", 
        joinColumns = @JoinColumn(name = "reference_range_id"),
        inverseJoinColumns = @JoinColumn(name = "dv_ordered_id"))
    private List<ReferenceRange<T>> otherReferenceRanges;
}

我明白了

Caused by: org.hibernate.AnnotationException: Property com.safehis.ehr.rm.datatypes.quantity.DvOrdered.otherReferenceRanges 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
at org.hibernate.cfg.PropertyContainer.assertTypesAreResolvable(PropertyContainer.java:140)
at org.hibernate.cfg.PropertyContainer.getProperties(PropertyContainer.java:118)
at org.hibernate.cfg.AnnotationBinder.addElementsOfClass(AnnotationBinder.java:1554)
at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:236)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:775)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3799)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1412)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)

非常感谢您提前回复。

有关IT技术的任何问题,请随时联系我。

你尝试了什么?你遇到了什么错误?顺便说一句,你真的有一个带有泛型类型的oneToMany吗?! - Shahzeb
请问您能提供涉及的类吗? - Didier L
添加了一个错误的详细信息。 - adolfoc
错误是有道理的。 它不知道关系是与哪个具体实体相关的。 - Shahzeb
1
我相信这个错误是有意义的。然而,问题是如何编写这种习语。 - adolfoc
解决这个泛型使用问题或设置明确的目标属性。 - Shahzeb
1个回答

1
由于类型擦除,编译时泛型信息丢失,因此Hibernate无法确定您的情况下T的类型。您可以将代码更改为以下内容:
private List<ReferenceRange<T>> otherReferenceRanges;

然后使用继承,使得每个ReferenceRange子类嵌入特定类型。

public abstract class ReferenceRange<T> {

    public abstract T getReference();
}

public class IntegerReferenceRange extends ReferenceRange<Integer> {

    private Integer reference;

    @Override
    public Integer getReference() {
        return reference;
    }
}

谢谢您的回复,但我不明白这如何有所帮助。是否有一种方法可以将Hibernate AnyMetaDef与OneToMany关联一起使用,然后像您建议的那样使用ReferenceRange < Integer>作为MetaValue? - adolfoc
使用@AnyMetaDef能够达到与继承相同的效果,但是您将无法使用嵌套泛型类型。 - Vlad Mihalcea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接