我使用JPA的Toplink实现遇到了一个奇怪的问题。我正在编写一个独立的应用程序来管理贷款。
我定义了一个与NOTICE类具有OneToMany(双向)关系的LOAN类。我创建了一个GUI来显示特定贷款的所有通知。在我的程序的另一部分,我可以发送延迟通知,保存为通知。但是,当我尝试显示贷款的所有通知时,迟到的通知没有出现。我已经检查了数据库,并且保存了一个条目,但由于某种原因,通知没有被删除。
只有当我重新启动我的应用程序时才会显示通知。
因为我已经定义了一个OneToMany关系,我本人并没有对数据库进行“直接”查询 - 我让JPA处理为我检索所有通知。
作为修复,我创建了一个查询来简单地获取特定贷款的所有通知。这有效。但是,我想通过定义两个类之间的OneToMany关系,这应该为我处理。似乎某些东西没有被正确刷新......好像正在使用“旧的”通知列表而不是从数据库中刷新?
答案 0 :(得分:4)
你怎么'发送迟到的通知'?需要有类似的声明:
MyLoanInstance.listOfNotices.add(MyNoticeInstance);
即使你已经有了
MyNoticeInstance.setLoan(MyLoanInstance);
语句
如果没有该调用,您必须完全重新加载正在使用的实例,或重新启动应用程序。
当您修改1侧时,Eclipselink不会自动更新(直到重新加载所有内容)1:M关系的M侧的集合,如果您在1:M关系的1侧更新引用修改M侧的集合。
作为旁注,您应该考虑检查EclipseLink,它是从TopLink演变而来的,您应该能够直接将EclipseLink .jar与TopLink .jar交换,只是为了收到一些折旧警告。 / p>
<强> Eclipse Link 强>
答案 1 :(得分:1)
在您持续发出通知后,您是否尝试过对您的实体经理进行同花? [entityManager.flush()]
答案 2 :(得分:0)
我想以下
@Entity
public class Loan {
private Integer id;
private List<Notice> noticeList;
@Id
@GeneratedValue
public Integer getId() {
return this.id;
}
@OneToMany(mappedBy="loan")
public List<Notice> getNoticeList() {
return noticeList;
}
}
@Entity
public class Notice {
private Integer id;
private Loan loan;
@Id
@GeneratedValue
public Integer getId() {
return this.id;
}
@ManyToOne(fetch=FetchType.LAZY)
public Loan getLoan() {
return this.loan;
}
}
你说过
在我的程序的另一部分,我可以发送延迟通知,保存为通知
也许你有两个EntityManager实例(程序的每个部分都有一个),所以最后的通知保存没有显示,因为两个entityManager都不共享相同的持久化上下文(一个不知道另一个发生的更改)。您可以做的是清除持久性上下文,然后再次检索它,如下所示
在你的程序的另一部分(持续通知后)致电
entityManager.flush();
当你想要追讨贷款及其通知时
entityManager.clear();
Query query = entityManager.creatQuery("from Loan l left join fetch l.noticeList where l.id = :id");
query.setParameter("id", yourLoanId);
检查一下,告诉我它是否正常。
的问候,