我有两个类,“article”包含一个@manytone引用,指向一个指定该文章附加费的“surchargegroup”。
@Entity
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(doNotUseGetters = true)
@Audited
public final class Article {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@Getter(onMethod_ = {@Key(PermissionKey.ARTICLE_ID_READ)})
@Setter(onMethod_ = {@Key(PermissionKey.ARTICLE_ID_WRITE)})
private int id;
@JoinColumn(nullable = false)
@ManyToOne
@Getter(onMethod_ = {@Key(PermissionKey.SURCHARGE_TABLE_SUPPLIER_READ)})
@Setter(onMethod_ = {@Key(PermissionKey.SURCHARGE_TABLE_SUPPLIER_WRITE)})
private SurchargeGroup surchargeGroup;
}
另一个类“surchargegroup”包含一个父对象引用,如果未设置任何父对象不提供附加费的情况,则该父对象引用可以将附加费继承到“surchargegroup”。
@Table
@Entity
@EqualsAndHashCode(doNotUseGetters = true)
@Audited
public class SurchargeGroup implements Serializable, Cloneable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column
@Getter(onMethod_ = {@Key(PermissionKey.SURCHARGE_TABLE_ID_READ)})
@Setter(onMethod_ = {@Key(PermissionKey.SURCHARGE_TABLE_ID_WRITE)})
private int id;
@Column
@Setter(onMethod_ = {@Key(PermissionKey.SURCHARGE_TABLE_SURCHARGE_WRITE)})
private Double surcharge;
@Column
@Getter(onMethod_ = {@Key(PermissionKey.SURCHARGE_TABLE_NAME_READ)})
@Setter(onMethod_ = {@Key(PermissionKey.SURCHARGE_TABLE_NAME_WRITE)})
private String name;
@JoinColumn
@ManyToOne(fetch = FetchType.EAGER)
@Getter(onMethod_ = {@Key(PermissionKey.SURCHARGE_TABLE_SUPPLIER_READ)})
@Setter(onMethod_ = {@Key(PermissionKey.SURCHARGE_TABLE_SUPPLIER_WRITE)})
private SurchargeGroup parent;
public double getSurcharge() {
if (surcharge == null) {
return parent == null
? supplier == null
? Setting.SURCHARGE_DEFAULT.getDoubleValue()
: supplier.getDefaultSurcharge()
: parent.getSurcharge();
} else return surcharge;
}
@JoinColumn
@ManyToOne
@Getter(onMethod_ = {@Key(PermissionKey.SURCHARGE_TABLE_SUPPLIER_READ)})
@Setter(onMethod_ = {@Key(PermissionKey.SURCHARGE_TABLE_SUPPLIER_WRITE)})
private Supplier supplier;
}
我现在的问题是,如果调用“getOverload()”方法,我会得到这个异常,我无法向自己解释,因为我将附加费组标记为fetch
Exception in thread "AWT-EventQueue-0" org.hibernate.LazyInitializationException: could not initialize proxy [kernbeisser.DBEntities.SurchargeGroup#1046] - the owning Session was closed
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:172)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:309)
at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor.intercept(ByteBuddyInterceptor.java:45)
at org.hibernate.proxy.ProxyConfiguration$InterceptorDispatcher.intercept(ProxyConfiguration.java:95)
at kernbeisser.DBEntities.SurchargeGroup$HibernateProxy$cdTAuBkS.getSurcharge(Unknown Source)
我问自己这是否是由@audited注解引起的?有什么想法吗?谢谢!
注意:@key注解对这个场景没有影响。
下面是调试器显示的内容(很抱歉使用了德语的tostring()函数):
2条答案
按热度按时间2w2cym1i1#
hibernate需要在某个时候停止急切地获取关联,否则它将需要无限次地加入关联
SurchargeGroup
实体(因为它引用自身)。可以使用
hibernate.max_fetch_depth
财产。drkbr07n2#
错误的来源是auditreader,即使它们被注解为fetch.eager,它也不会获取所有的eager属性。eager看起来auditreader只获取一个级别的eager关系:
物品->附加费组->附加费组->(已提取(已提取)(未提取)