0

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

为了简化编码,我在任何地方都创建了IMasterOrder对象IOrder,但是当它需要指定具体类型时,我只需将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订单实体实例的finder方法是这样的

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

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

4

2 回答 2

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;
于 2012-06-24T14:00:50.800 回答
0

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

于 2012-06-24T14:17:26.563 回答