每当我的应用程序中的实体包含与数据库实体不同的数据时,我想更新数据库中的实体。
我的更新方法如下:
@Transactional
public void updateEntity(String a, String b, boolean c, Date d) { //some more params
MyEntity entity = dao.findEntityBy(a, b, c); //might be some more params
//nullcheck
if (!entity.getA().equals(a)) {
entity.setA(a);
}
if (!entity.getB().equals(b)) {
entity.setB(b);
}
//repeat per property... a-n
dao.save(entity);
}
问题: 我是否应该检查实体的每个属性是否已更改,然后仅使用setter?或者我应该跳过检查并只是覆盖实体?
MyEntity entity = dao.findEntityBy(a, b, c);
entity.setA(a);
entity.setB(b);
//...
dao.save(entity);
有什么好处?两种解决方案的优点是什么(dis)?
答案 0 :(得分:3)
如果您有许多属性,可以使用dynamic-update=true
来优化性能。 dynamic-update属性告诉Hibernate是否在SQL UPDATE语句中包含未修改的属性。
可以配置为
@Entity
@Table(name = "MY_ENTITY")
@org.hibernate.annotations.Entity(
dynamicUpdate = true
)
public class MyEntity {
}
答案 1 :(得分:2)
在每个“生产就绪”软件中都可以看到第二个版本
MyEntity entity = dao.findEntityBy(a, b, c);
entity.setA(a);
entity.setB(b);
//...
dao.save(entity);
老实说,我没有看到第一个选项的附加值(但可以看到增加的维护和较低的可读性)。