【问题标题】:How to tell Hibernate to not update certain columns如何告诉 Hibernate 不更新某些列
【发布时间】:2011-11-11 17:58:36
【问题描述】:

我有一个应用程序可以让用户有机会更新某些值。我只想将这些列上的信息发送给用户并进行更新。

我想保留从他们发送给我的内容创建的休眠实体,但不更新用户无权访问的列。同样,如果他们请求新条目,我想使用他们发送给我的数据并将未提及的列设置为数据库默认值。

有没有简单的方法或最佳实践?

我是否应该创建第二个映射到未提及这些列的表?

【问题讨论】:

    标签: java database hibernate


    【解决方案1】:

    我想我会在映射文件上标记属性 update="false"。我很想听听是否有办法坚持下去,所以如果我写了其他东西来改变这些领域,它可以做到。

    【讨论】:

    • update="false" 不适用于我的情况 :( 编辑:它确实有效 - 它实际上并没有在数据库中更新,但使用修改后的错误字段读取休眠实体。
    【解决方案2】:

    在 Hibernate 中使用 updateable=false 以避免更新列。

    例如:

    @Column(name=CRE_TS, updatable=false)
    private Date getCreTs(){
       return this.creTs;
    } 
    

    【讨论】:

      【解决方案3】:

      如果您不想更新这些列,就不要调用这些列的设置器吗?如果未调用列的 setter(或使用新值调用),则不会更新该列。

      您需要先使用 hibernate 获取条目,然后调用相应列的设置器,然后将其持久化。这样,您不想更改的数据就不会更改。

      【讨论】:

      • 我想我可以这样做,但这有点不方便。我需要获取用户给我的数据,从数据库中读取记录,编写合并它们的方法,最后持久化记录。我想考虑到我正在使用 Hibernate,我很容易下车。我已经接受 Hibernate 是额外的工作,但我希望它不涉及额外的 I/O。
      • 如果在数据库端管理某些内容,例如带有触发器的修改/创建日期,则在不重新选择该实体的情况下,该数据将无法用于休眠。 updatable = false 的要点是让hibernate不会破坏DB生成的字段值。
      【解决方案4】:

      我的要求是我不想更新method1()中的列,但它应该在method2()中更新,所以配置级别在这里不起作用。

      解决方案是创建一个Cloneable POJO 并覆盖clone() 方法。

      public class User implements Cloneable {
      //properties
      @Override
          public Object clone() throws CloneNotSupportedException {
              return super.clone();
          }
      }
      

      从会话中获取对象

      User user = <from Session suppose>.
      User clone  = null;
      try {
          clone = (User) user .clone();    // clone the real object
      } catch (CloneNotSupportedException e) {
          //log your Exception here
      }
      clone.setUserName("Avinash");
          transaction.commit();
      }
      session.close();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-02
        • 2012-03-25
        • 2012-06-22
        • 2019-06-27
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多