Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 持久化并选择父实体后,子实体为空_Java_Jpa_Eclipselink - Fatal编程技术网

Java 持久化并选择父实体后,子实体为空

Java 持久化并选择父实体后,子实体为空,java,jpa,eclipselink,Java,Jpa,Eclipselink,请帮忙!这已经花了我一天的时间,我还没有接近解决这个问题。我的设置如下: 靛蓝蚀 日食2.3 ApacheTomcat6 我所做的是持久化一个实体,该实体与子实体具有@OneToOne映射。一旦记录进入数据库,我将运行select并成功地选择新插入的记录。但是,子实体为空 我的目标是只插入父记录,因为子记录已经在数据库中 问题:我需要更改什么以填充子记录 我有一个我坚持的实体: EntityManager em = getEntityManager(); try { em.getTran

请帮忙!这已经花了我一天的时间,我还没有接近解决这个问题。我的设置如下:

  • 靛蓝蚀
  • 日食2.3
  • ApacheTomcat6
  • 我所做的是持久化一个实体,该实体与子实体具有@OneToOne映射。一旦记录进入数据库,我将运行select并成功地选择新插入的记录。但是,子实体为空

    我的目标是只插入父记录,因为子记录已经在数据库中

    问题:我需要更改什么以填充子记录

    我有一个我坚持的实体:

    EntityManager em = getEntityManager();
    try {
        em.getTransaction().begin();
        em.persist(timeSheet);
        em.getTransaction().commit();
    }
    
    该实体包含@OneToOne:

    @Entity
    @Cache(expiry=-1)
    @Table(name="TIME_SHEET")
        public class TimeSheet implements Serializable {
            private static final long serialVersionUID = 1L;
    
            @OneToOne(fetch=FetchType.EAGER)
            @JoinColumns({
                @JoinColumn(name="PROJECT_ID", referencedColumnName="PROJECT_ID", nullable = false, insertable=false, updatable=false),
                @JoinColumn(name="COMPANY_ID", referencedColumnName="COMPANY_ID", nullable = false, insertable=false, updatable=false)
            })
            private Project project;
            public Project getProject() {
                return project;
            }
    
    子实体是:

    @Entity
    @Cache(expiry=-1)
    @Table(name="PROJECT")
    public class Project implements Serializable {
        private static final long serialVersionUID = 1L;
    
        @EmbeddedId
        private ProjectPK id;
    
    持久化并选择“时间表”后,“项目”为空。我应该如何确保“项目”已填充


    谢谢大家!

    那么,在所示的代码中,您在没有首先在时间表中设置项目的情况下持久化了时间表,那么为什么您希望在加载时间表时它会有一个项目呢?永远不要期望加载对象模型后的外观与保存对象模型前的外观有所不同。如果看起来确实不一样,那么您就有问题了。

    正如Ryan指出的,您需要在时间表中维护对项目的引用。这是因为时间表是缓存的。因此,您可以在创建时间表时通过读取现有项目来设置关系,也可以在事务提交后刷新时间表以构建它


    您显示的代码将时间表->项目关系字段设置为只读,不显示外键的填充方式。确保在通过其他映射插入时间表时实际设置了这些字段,或者时间表没有合法的项目-尽管字段似乎具有NOTNULL约束

    您应该正确设置级联策略

    @OneToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    


    级联策略指定在父实体上执行持久性操作时,如何处理关联实体。

    谢谢!我打算做的是只保留时间表(在插入时间表之前,项目已经在数据库中)。然后,作为一个不同的事务,通过单击JSP上的按钮,用户将刷新时间表列表。但是,当列表刷新时,项目对象将在1分钟或5分钟内加载,因此非常不一致。。。问题:我如何通过@OneToOne使时间表实体加载项目,或者我需要更改设计并手动加载项目?我们中的一方不了解另一方。如果希望时间表与项目关联,则必须在保存时间表的事务中的时间表上设置项目(反之亦然)。Ryan,您的建议解决了此问题!感谢您的快速回复!但是,我有一个问题:在持久化项目之前设置项目是否会导致项目记录的更新?我是否应该使用注释来避免此类更新?我无法准确回答,因为我不知道您的项目。在事务中对对象模型所做的更改将以将对象映射到数据库的任何方式持久化。这就是交易的目的。如果不希望持久化更改,则不要对模型进行更改。就这么简单,谢谢你,克里斯!我计算了“缓存”部分,并尝试使用“@Cache(expiry=-1)”注释来缓解它,这在父记录被持久化的场景中不起作用。问题:提交后如何刷新?另外,设置外键的好处是什么?您能举个例子吗?请注意,我从未打算在插入“时间表”时插入“项目”。谢谢你,克里斯!正如我提到的,我使用Eclipselink 2.3,但假设Hibernate的行为相同,我应该如何阅读上面的CasadeType序列?假设我只想持久化父实体,并且在后续选择期间仅加载子实体,作为新事务的一部分,那么您的示例应该如何更改?非常感谢。