有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数据库Java JPA OneToMany“多”关系不刷新

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

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

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

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

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


共 (3) 个答案

  1. # 1 楼答案

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

    MyLoanInstance.listOfNotices.add(MyNoticeInstance);
    

    即使你已经有了

    MyNoticeInstance.setLoan(MyLoanInstance);
    

    声明

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

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

    作为一个旁注,你应该考虑签出EclipseLink,它是由TopLink演变而来的,你应该能够直接交换Eclipse。与顶部链接的jar。jar,如果只是收到一些折旧警告的话

    Eclipse Link

  2. # 2 楼答案

    在您坚持通知后,您是否尝试对您的实体经理进行刷新? [entityManager.flush()]

  3. # 3 楼答案

    我想是这样的

    @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;
        }
    
    }
    

    你说过

    In another part of my program I can send out late notices which is saved as a NOTICE

    可能您有两个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);
    

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

    问候,