【发布时间】:2017-02-16 08:58:48
【问题描述】:
我收到一个包含 30 个字段的 JSON,我的实体是根据这个 JSON 构建的。 问题是:不应更新两个字段(两个日期)。
如果我使用entity.merge,两个字段都会更新。
如何避免这两个字段被更新?
也许使用criteria.Example?
有没有什么方法可以在我不写大量 HQL 的情况下做到这一点?
【问题讨论】:
标签: java json hibernate jpa orm
我收到一个包含 30 个字段的 JSON,我的实体是根据这个 JSON 构建的。 问题是:不应更新两个字段(两个日期)。
如果我使用entity.merge,两个字段都会更新。
如何避免这两个字段被更新?
也许使用criteria.Example?
有没有什么方法可以在我不写大量 HQL 的情况下做到这一点?
【问题讨论】:
标签: java json hibernate jpa orm
如果您不想更新这两个字段,可以用@Column(updatable=false) 标记它们:
@Column(name="CREATED_ON", updatable=false)
private Date createdOn;
一旦你加载了一个实体并且你修改了它,只要当前的Session或者EntityManager是打开的,Hibernate就可以通过脏检查机制来跟踪变化。然后,在flush 期间,将执行SQL 更新。
如果您不喜欢所有列都包含在UPDATE 语句中,您可以使用动态更新:
@Entity
@DynamicUpdate
public class Product {
//code omitted for brevity
}
那么,UPDATE 语句中将只包含修改后的列。
【讨论】:
@SelectBeforeUpdate (docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/…) ?因为@DynamicUpdate 确实只更新了更改的字段,但是当我的实体之前包含 5 个外键并更新时,它会选择所有这些关系,即使它们没有更改。我想在更新之前摆脱这种不必要的选择。对我来说,@SelectBeforeUpdate(false) 不像我认为的那样工作。
喜欢这个例子:
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注解来表明一个字段不会被持久化到数据库中。
【讨论】: