JPA实体的集合成员分离或不管理

时间:2012-06-15 22:55:43

标签: java spring hibernate jpa openjpa

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

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

问题是,这使得master类总是对其命令返回null。我很好奇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以及全部为null的日志和订单。那么如何解决这个问题呢?提前谢谢。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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