【问题标题】:Is it possible to treat a table as read only in hibernate?是否可以在休眠中将表视为只读?
【发布时间】:2012-04-14 13:51:54
【问题描述】:

我有一些表我没有理由从应用程序中更新,所以我想防止它发生,即使是由于其他地方的错误而意外发生。

我看到了@Immutable 注释,但看起来它仍然允许插入和删除。我想完整地对待整个表格(不仅仅是每个实体),就像写在石头上一样。有没有简单的方法来实现这一点?还是我误解了@Immutable 上的文档?

如果需要一个示例,假设有一个带有MONTH 表的表,一个Month 实体,以及一个带有Appointment 关联实体的APPOINTMENT 表。我永远不想在月份中删除或插入一行。

【问题讨论】:

    标签: java database hibernate orm


    【解决方案1】:

    你试过只读缓存策略吗:

    如果您的应用程序需要读取,但不修改,持久类的实例,可以使用只读缓存。这是最简单和最佳的执行策略。在集群中使用它甚至是安全的。

    发件人:19.2.2. Strategy: read only

    【讨论】:

    • 感谢您的回答。我想这就是我需要的。从文档看来,这至少会从性能的角度进行优化。我没有时间亲自验证这是否能满足我的主要需求,即防止应用程序尝试保存/更新/删除。当我有机会验证这一点时,我会接受答案或发表评论。
    【解决方案2】:

    一种方法是使用READ_ONLY 事务,方法是将@Transactional(readOnly=true) 置于方法之上。

    http://www.codeinstructions.com/2009/04/read-only-transactions-with-spring-and.html.

    另一种方法:就隔离级别而言,如果您的表从未插入或更新,您可以使用 READ_UNCOMMITTED 隔离级别,它允许脏读、不可重复读和幻读。然而,这些都不重要,因为数据永远不会改变。

    您可以在 spring javadocs (http://docs.huihoo.com/javadoc/spring/2.5/org/springframework/transaction/annotation/Isolation.html) 中查看每个的不同隔离级别和效果

    这将最大程度地释放行上的锁,并为您提供最佳性能,至少就锁定而言

    【讨论】:

    • 隔离级别似乎有助于提高性能,感谢您让我知道。但它真的会阻止读取/保存/更新吗? Transactional(readOnly=true) 也很高兴知道,我认为在某些情况下这可能是完美的。如果您可以为整个实体设置它,那将是完美的。
    • 我不确定,但我不这么认为。它将允许插入,但速度很快,因为没有发出锁。要处理 INSERTS,请使用 readOnly=true 选项。插入时会抛出异常。否则我会确认正确答案。
    猜你喜欢
    • 2022-01-04
    • 2015-03-22
    • 1970-01-01
    • 2014-10-27
    • 2016-09-06
    • 1970-01-01
    • 2020-10-19
    • 2017-06-27
    • 2014-12-15
    相关资源
    最近更新 更多