Java JPA OneToMany-“;“许多”;关系不新鲜

Java JPA OneToMany-“;“许多”;关系不新鲜,java,database,jpa,Java,Database,Jpa,我在使用JPA的Toplink实现时遇到了一个奇怪的问题。我正在写一个独立的应用程序来管理贷款 我定义了一个贷款类,它与通知类具有一对一(双向)关系。我创建了一个GUI来显示特定贷款的所有通知。在我的程序的另一部分,我可以发送延迟通知,并将其保存为通知。但是,当我试图显示贷款的所有通知时,延迟通知不会出现。我已经检查了数据库,并保存了一个条目,但由于某种原因,通知没有被删除 只有当我重新启动应用程序时,才会出现通知 因为我已经定义了一个OneToMany关系,所以我自己并没有对数据库进行“直接”

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

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

只有当我重新启动应用程序时,才会出现通知

因为我已经定义了一个OneToMany关系,所以我自己并没有对数据库进行“直接”查询——我让JPA为我检索所有通知


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

@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.clear();

Query query = entityManager.creatQuery("from Loan l left join fetch l.noticeList where l.id = :id");

query.setParameter("id", yourLoanId);
检查一下,告诉我它是否工作正常


关于,

我想:

@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.clear();

Query query = entityManager.creatQuery("from Loan l left join fetch l.noticeList where l.id = :id");

query.setParameter("id", yourLoanId);
检查一下,告诉我它是否工作正常


您好,

您是否在保留通知后尝试刷新您的实体经理?
[entityManager.flush()]

您是否在保留通知后尝试刷新您的实体管理器?
[entityManager.flush()]

您如何“发送延迟通知”?需要有一个类似于以下内容的声明:

MyLoanInstance.listOfNotices.add(MyNoticeInstance);
即使你已经有了

MyNoticeInstance.setLoan(MyLoanInstance);
声明

如果没有该调用,则必须完全重新加载正在使用的实例,或者重新启动应用程序

修改1:M关系的1侧时,Eclipselink不会自动更新(直到重新加载所有内容)1:M关系的M侧的集合,如果修改M侧的集合,Eclipselink也不会更新1:M关系的1侧的引用

作为一个旁注,你应该考虑签出EclipseLink,它是由TopLink演变而来的,你应该能够直接与OutsLink。jar与TopLink。jar,如果只接收一些贬值警告。


您是如何“发送延迟通知”的?需要有一个类似于以下内容的声明:

MyLoanInstance.listOfNotices.add(MyNoticeInstance);
即使你已经有了

MyNoticeInstance.setLoan(MyLoanInstance);
声明

如果没有该调用,则必须完全重新加载正在使用的实例,或者重新启动应用程序

修改1:M关系的1侧时,Eclipselink不会自动更新(直到重新加载所有内容)1:M关系的M侧的集合,如果修改M侧的集合,Eclipselink也不会更新1:M关系的1侧的引用

作为一个旁注,你应该考虑签出EclipseLink,它是由TopLink演变而来的,你应该能够直接与OutsLink。jar与TopLink。jar,如果只接收一些贬值警告。


能否显示您的贷款及其@OneToMany映射以及您试图保存的代码?很高兴我的回答能够帮助您,我在使用不同的ORM时也遇到过类似的问题。这可能会让人困惑,因为ORM处理了对象生命周期中的许多部分,很难判断何时需要额外的代码。你能展示一下你的贷款、它的@OneToMany映射以及你试图保存的代码吗?很高兴我的答案能够帮到你,我在使用不同的orm时也遇到过类似的问题。这可能会让人感到困惑,因为ORMs处理了对象生命周期中的许多部分,很难判断何时需要额外的代码。这很有效!当“发出延迟通知”时,我只关心1:M关系的一面——正如你上面提到的。然而,当我加载贷款以查看发出的不同通知时,我认为我是在“完全重新加载实例”。也许我需要在加载贷款实例时仔细查看我的代码。这很有效!当“发出延迟通知”时,我只关心1:M关系的一面——正如你上面提到的。然而,当我加载贷款以查看发出的不同通知时,我认为我是在“完全重新加载实例”。也许我需要在加载贷款实例时仔细查看我的代码。上面描述的贷款和通知实体类与我编写它们的方式几乎相同。我解决问题的最初工作是创建一个如上所述的查询,但是我不明白为什么do-MyLoanInstance.getNoticeList()不能提供与直接执行查询相同的结果。我确实认为这是一个“刷新”问题,与上面描述的两个entityManager实例有关。。。然而,我通过Tnay的建议解决了这个问题。您上面描述的贷款和通知实体类与我编码它们的方式基本相同。我解决问题的最初工作是创建一个如上所述的查询,但是我不明白为什么do-MyLoanInstance.getNoticeList()不能提供与直接执行查询相同的结果。我确实认为这是一个“刷新”问题,与上面描述的两个entityManager实例有关。。。然而,我通过特奈的建议解决了这个问题。