Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 Hibernate/JPA保持关系更改,尽管cascade=REFRESH_Java_Hibernate_Jpa - Fatal编程技术网

Java Hibernate/JPA保持关系更改,尽管cascade=REFRESH

Java Hibernate/JPA保持关系更改,尽管cascade=REFRESH,java,hibernate,jpa,Java,Hibernate,Jpa,我遇到了一个奇怪的问题,一个实体正在通过一个未设置为级联的关系进行更新,希望有人能给出解释。基本对象结构是具有相关统计对象的文章。统计数据的数据库表是由一个完全不同的进程更新的(在Hibernate之外,在不同的服务器上有完全不同的JVM),但是我们看到这些更改恢复到了在我们最终执行保存时阅读文章时的状态。如果它没有被设置为刷新,这肯定是有意义的,但因为它是,我感到困惑 @Entity public class Article { @Id @GeneratedValue(stra

我遇到了一个奇怪的问题,一个实体正在通过一个未设置为级联的关系进行更新,希望有人能给出解释。基本对象结构是具有相关统计对象的文章。统计数据的数据库表是由一个完全不同的进程更新的(在Hibernate之外,在不同的服务器上有完全不同的JVM),但是我们看到这些更改恢复到了在我们最终执行保存时阅读文章时的状态。如果它没有被设置为刷新,这肯定是有意义的,但因为它是,我感到困惑

@Entity
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne(cascade = {CascadeType.REFRESH})
    private Statistics statistics;
}

@Entity
public class Statistics {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long views;
}
最奇怪的是,不管级联类型如何,它似乎都在这样做。如果我只坚持,甚至没有级联,它似乎仍然在恢复统计数字。我确实看到它在保存文章时对Statistics对象执行SELECT操作,并且只有在看到它已更改时才执行UPDATE语句将其还原

这似乎在其他任何地方都不是问题,我们在所有地方都进行了刷新,它的表现似乎很好,没有将保存更改级联到那些对象

这是我看到的一个例子

Article article = articleRepository.get(1l);
// article.getStatistics().getViews() = 4
// article is detached and some amount of time goes
// underlying database table is updated and views are incremented
// article reattached with changes
articleRepository.save(article);

在该片段的末尾,数据库显示了统计对象的4个视图,但我不希望将保存级联到统计对象并覆盖数据库中的现有数据。

定义刷新级联不会触发任何事件-您必须实际刷新文章实例,以便级联发挥神奇的作用。你能把代码发布到你希望实体被刷新的地方吗?我不希望从统计对象中刷新或持久化任何东西。因此,如果统计数据中包含的数据已经过时,那也没关系。但是我不希望在保存文章时将统计对象中的陈旧数据写入数据库,这就是正在发生的事情。下面的save在做什么,它只是一个JPA EM.merge吗?我想我现在理解了这个问题-来自应用程序的陈旧统计数据被写入数据库,就像定义了合并级联一样。由于合并不是级联的,因此其行为确实出乎意料。锁定充其量是一个糟糕的解决方法,我没有更好的主意,所以请原谅我浪费了你的时间。没错!提供帮助绝不是浪费我的时间,我非常感谢你的帮助。谢谢很抱歉没有说得更清楚,浪费了您的时间!=)