3

我的项目中有以下映射:

@Embeddable
class LineItem {
    ...
}

@Entity
abstract class Invoice {
    ...
    @ElementCollection @OrderColumn @NotEmpty
    List<LineItem> lineItems = []
    ...
}

@Entity
class PurchaseInvoice extends Invoice {
    ...
    @OneToOne(cascade=CascadeType.ALL, orphanRemoval=true)
    Payment payment
    ...
}

@Entity
class Payment {
    ...
    @ElementCollection @OrderColumn
    List<PaymentTerm> paymentTerms = []
    ...
}

@Embeddable
class PaymentTerm {
    ...
}

默认情况下,所有集合关联都是惰性的。我的目标是创建一个可用于急切加载PurchaseInvoice.lineItemsPurchaseInvoice.payment.paymentTerms.

如果我定义以下实体图:

@NamedEntityGraph(name='PurchaseInvoiceWithDetail', attributeNodes = [
     @NamedAttributeNode(value='payment', subgraph='payment'),
     @NamedAttributeNode(value='lineItems')
], subgraphs = [
     @NamedSubgraph(name='payment', type=Payment, attributeNodes = [
         @NamedAttributeNode(value='paymentTerms')
     ])
])
@Entity
class PurchaseInvoice extends Invoice

我收到以下无法构建实体管理器工厂错误:

java.lang.IllegalArgumentException: Unable to locate Attribute  with the given name [lineItems] on this ManagedType [PurchaseInvoice]

在 JPA 2.1 实体图中引用超类(或子类)中的属性的正确方法是什么?

4

3 回答 3

5

从 hibernate-entitymanager 4.3.4 开始不支持此功能。这是我到目前为止发现的:

  1. @NamedAttributeNode 不能用于引用超类的属性。
  2. includeAllAttributes=true将包括所有属性,包括超类的属性。
  3. @NamedAttributeNode在子图中可以引用超类的属性。
于 2014-03-29T04:02:31.670 回答
1

也许这是图形定义中的一个简单语法问题?在我看来,该定义不包含方括号。我测试了你的代码,没问题。

请参阅:开发者博客

于 2014-03-23T12:31:16.503 回答
0

根据此链接,这是一个 Hibernate 错误,并声称已在 4.3.6 版中修复

于 2015-10-16T13:45:11.637 回答