【问题标题】:How to annotate hibernate collections with generic types?如何用泛型类型注释休眠集合?
【发布时间】:2023-03-18 18:45:02
【问题描述】:

我有一个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)

提前感谢您的回复。

【问题讨论】:

  • 您尝试过什么,遇到的错误是什么?作为旁注,你真的有一个泛型类型的 oneToMany !!!!
  • 能否提供所涉及的课程?
  • 添加了一个错误的详细信息,
  • 错误很有意义。它不知道关系与哪个具体实体。
  • 我确信这个错误是有道理的。然而,问题是如何写这种类型的成语。

标签: java hibernate jpa hibernate-mapping generics


【解决方案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 作为 MetaValue?
  • 使用@AnyMetaDef 与使用继承的效果相同,但您不能使用嵌套的泛型类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多