Java JPA OneToMany - “很多”关系并不令人耳目一新

时间:2009-09-23 13:36:07

标签: java database jpa

我使用JPA的Toplink实现遇到了一个奇怪的问题。我正在编写一个独立的应用程序来管理贷款。

我定义了一个与NOTICE类具有OneToMany(双向)关系的LOAN类。我创建了一个GUI来显示特定贷款的所有通知。在我的程序的另一部分,我可以发送延迟通知,保存为通知。但是,当我尝试显示贷款的所有通知时,迟到的通知没有出现。我已经检查了数据库,并且保存了一个条目,但由于某种原因,通知没有被删除。

只有当我重新启动我的应用程序时才会显示通知。

因为我已经定义了一个OneToMany关系,我本人并没有对数据库进行“直接”查询 - 我让JPA处理为我检索所有通知。

作为修复,我创建了一个查询来简单地获取特定贷款的所有通知。这有效。但是,我想通过定义两个类之间的OneToMany关系,这应该为我处理。似乎某些东西没有被正确刷新......好像正在使用“旧的”通知列表而不是从数据库中刷新?

3 个答案:

答案 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);

检查一下,告诉我它是否正常。

的问候,