如何有效地更新DB中的实体?

时间:2014-12-16 14:37:41

标签: java spring hibernate

每当我的应用程序中的实体包含与数据库实体不同的数据时,我想更新数据库中的实体。

我的更新方法如下:

    @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)?

2 个答案:

答案 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);

老实说,我没有看到第一个选项的附加值(但可以看到增加的维护和较低的可读性)。