【问题标题】:JPA entity's collection members get detached or not managedJPA 实体的集合成员被分离或不受管理
【发布时间】:2012-06-15 22:55:43
【问题描述】:

TGIF 伙计们,但我仍然坚持我的一个项目。我有两个接口IMasterOrderIOrder。一个IMasterOrder 可能有一个IOrder 的集合。所以可以有几个MasterOrder实体类和Order实体类实现接口。

为了简化编码,我在各处创建IMasterOrderIOrder 对象,但是当它需要指定具体类型时,我只需将IMasterOrder 对象转换为类类型。

问题是,这使得主类总是返回关于其订单的空值。我很好奇 JPA 通常如何处理多态性?

更新

抱歉,之前的混乱。其实这个问题要简单得多

其实实体类是这样的

public class MasterOrder implements IMasterOrder {

// Relationships

@OneToOne(mappedBy = "masterOrder")
private OrderCustomFields customFields;

@OneToMany(mappedBy = "masterOrder")
private List<OrderLog> logs;

@OneToMany(mappedBy = "masterOrder")
private Collection<Order> orders;

// Fields...

而获取Master order实体实例的finder方法是这样的

 public static MasterOrder findMasterOrder(String id) {
    if (id == null || id.length() == 0) return null;
    return entityManager().find(MasterOrder.class, id);
}

但是,此 finder 方法中的 MasterOrder 实例返回的 customFields 以及日志和订单都为空。那么如何解决这个问题呢?提前致谢。

【问题讨论】:

  • 认为你必须展示一些代码。特别是当你坚持和当你查询/使用..
  • 请记住,JPA 没有指定对接口类型(或接口集合)的字段的支持,尽管 DataNucleus JPA 等一些实现确实提供了对这些字段的支持(供应商扩展)
  • @barsju 感谢您的反馈。我已经更新了帖子,很高兴你能提供一些提示。
  • 我认为您也应该显示 Order 类。

标签: java spring hibernate jpa openjpa


【解决方案1】:

当您访问日志和订单时,Master 是否仍然是活动持久性上下文的一部分?即:找到主实体的EntityManager 是否已关闭或清除?如果是,则一切正常。

对于咯咯笑,您可以尝试将日志和订单上的 fetch 属性更改为 EAGER ......这将有助于查明是否还有其他不好的事情发生。

@OneToMany(mappedBy = "masterOrder", fetch = FetchType.LAZY)
private List<OrderLog> logs;

@OneToMany(mappedBy = "masterOrder", fetch = FetchType.LAZY)
private Collection<Order> orders;

【讨论】:

    【解决方案2】:

    听起来你的映射有问题。我不认为空集合应该是 NULL,它们应该是一个空列表(如果已初始化),或者是一个在您读取它时将被初始化的代理。如果你离开事务并尝试从集合中读取,它应该抛出一个惰性初始化异常。无论哪种情况,您都应该在问题中包含所有相关类以提供更多信息。

    【讨论】:

    • 仅供参考,访问卸载集合时的行为取决于提供者,并非所有提供者都会抛出延迟初始化异常。
    • 我知道,但他用 Hibernate 标记了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2015-12-30
    • 2016-02-10
    • 2012-05-17
    • 2015-08-10
    相关资源
    最近更新 更多