我正在使用休眠条件 API 来检索数据。这些数据只会被用户查看。用户不能修改这些数据。那么,使用 readOnly 有什么好处吗?你能建议利弊吗?我还需要考虑其他措施吗?
2 回答
Hibernate 正在跟踪会话中加载的所有对象以查找修改并在刷新会话时保留所有更改。如果将实体加载为只读,则指示 Hibernate 不要跟踪该实体的更改。这样,您将获得一些性能提升。
但是,该对象将保留在会话缓存中。如果缓存太大,它会成为一个很大的性能问题,并且可能会耗尽内存。如果您读取了许多对象,最好将它们逐出。
如果 Hibernate 的性能确实是一个问题,那么切换到纯 JDBC 是一个更好的选择。我从不使用 Hibernate 来加载大量数据(例如用于报告或批处理)。为了显示列表,我只加载我需要的字段,而不是整个实体(如果您只读取选择的字段而不是整个实体,它们始终是只读的)。
所以答案是,是的,它会让 Hibernate 更快一点,但还有其他方法可以获得更高的性能。
使用只读实体更像是意图的表达。通过使用只读休眠将不会检查实体是否已更改,即使它已更改。这与标记为不可变的实体不同,因为它们是防止更改的。如果 Hibernate 检测到不可变实体对象的属性已更改,则会出错,但对于只读实体则不然。
因此,将实体设置为只读只会通知 hibernate 您不希望保留更改。在关联集合的情况下,这也可能不是真的。
除非您有特殊要求或进行特别昂贵的脏污检查,否则性能提升很小。
所以这与性能无关。这是一种安全措施,可让您保护数据库免受对对象的意外更改。
例如,您有一个描述地理位置的 Location 实体。现在您有了一个人并为其分配了一个位置。使用人员关联加载位置时,您可以将位置设置为只读,即使您的同事(或您自己)不小心更改了位置。不会存储更改,但对 Person 实体的更改仍会存储。(最好将位置标记为不可变,但在极少数情况下这还不够。)