我遇到了一个奇怪的问题,即一个实体正在通过未设置为级联的关系进行更新,并希望有人有解释。基本对象结构是带有相关Statistics对象的Article。统计信息的数据库表由一个完全不同的进程更新(在Hibernate之外,在不同的服务器上完全不同的JVM),但我们看到这些更改恢复到我们最终执行保存时读取文章时的状态。如果它没有设置为REFRESH肯定会有意义,但因为它是,我很困惑。
@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;
}
最奇怪的是,无论级联类型如何,它似乎都是这样做的。如果我只放置PERSIST,甚至没有级联,它似乎仍然会恢复统计数字。我确实看到它在保存文章时在Statistics对象上执行SELECT,并且只有在它看到它已经改变时才执行UPDATE语句以将其还原。
这在其他任何地方似乎都不是问题,我们在整个地方都有REFRESH,它似乎表现得很好,不会级联保存对这些对象的更改。
以下是我所看到的一个例子......
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个视图,但我不希望将该保存级联到Statistics对象并覆盖数据库中的现有数据。