如何使用Hibernate仅更新所有实体属性的一部分

时间:2016-10-07 11:16:51

标签: java json hibernate jpa orm

我收到一个包含30个字段的JSON,我的实体是从这个JSON构建的。 问题是:不应更新两个字段(两个日期)。

如果我使用entity.merge,则会更新这两个字段。

如何避免更新这两个字段?

也许使用标准。例如?

如果没有我写大量的HQL,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:10)

This article详细解释了你的问题,但我也会在这里总结一下。

如果您永远不想更新这两个字段,可以使用updatable=false标记它们:

@Column(name="CREATED_ON", updatable=false)
private Date createdOn;

加载实体并进行修改后,只要当前SessionEntityManager处于打开状态,Hibernate就可以通过dirty checking mechanism跟踪更改。然后,during flush,将执行SQL更新。

如果您不喜欢UPDATE语句中包含所有列,则可以使用动态更新:

@Entity
@DynamicUpdate
public class Product {
   //code omitted for brevity
}

然后,只有修改后的列才会包含在UPDATE语句中。

答案 1 :(得分:1)

请像这样的例子:

    public class UpdateMethodDemo {
        public static void main(String[] args) {
            Session session = HibernateUtil.getSessionFactory().openSession();
            Student s = studentService.getById(1);
            s.setNom("FuSsA");
            session.beginTransaction();
            session.update(s);
            session.getTransaction().commit();
            session.close();
        }

} 

修改

您可以使用@Transient注释来指示字段不会保留在数据库中。