TGIF家伙,但我仍然坚持我的一个项目。我有两个接口IMasterOrder
和IOrder
。一个IMasterOrder
可能有IOrder
的集合。因此,可以有多个实现接口的MasterOrder
实体类和Order
实体类。
为了简化编码,我在任何地方创建IMasterOrder
和IOrder
个对象,但是当需要指定具体类型时,我只是将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的日志和订单。那么如何解决这个问题呢?提前谢谢。
答案 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,它们应该是一个空列表(如果已初始化),或者是从你读取时初始化的代理。如果你离开事务并尝试从集合中读取,它应该抛出一个惰性初始化异常。在任何一种情况下,您都应该在问题中包含所有相关的类以提供进一步的信息。