Java 如何有效地更新数据库中的实体?

Java 如何有效地更新数据库中的实体?,java,spring,hibernate,Java,Spring,Hibernate,每当应用程序中的实体包含与DB实体不同的数据时,我希望更新数据库中的实体 我的更新方法如下: @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 //null

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

我的更新方法如下:

    @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)优点是什么?

几乎在您可以看到的每一个“生产就绪”软件的第二版本中

MyEntity entity = dao.findEntityBy(a, b, c);
entity.setA(a);
entity.setB(b);
//...
dao.save(entity);
老实说,我没有看到第一个选项的附加值(但可以看到增加的维护和较低的可读性)。

几乎在每个“生产就绪”软件中都可以看到第二个版本

MyEntity entity = dao.findEntityBy(a, b, c);
entity.setA(a);
entity.setB(b);
//...
dao.save(entity);

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

如果您有许多属性,可以使用
动态更新=true
来优化性能。动态更新属性告诉Hibernate是否在SQL update语句中包含未修改的属性

它可以配置为

@Entity
@Table(name = "MY_ENTITY")
@org.hibernate.annotations.Entity(
        dynamicUpdate = true
)
public class MyEntity {
}

如果您有许多属性,可以使用
dynamic update=true
优化性能。动态更新属性告诉Hibernate是否在SQL update语句中包含未修改的属性

它可以配置为

@Entity
@Table(name = "MY_ENTITY")
@org.hibernate.annotations.Entity(
        dynamicUpdate = true
)
public class MyEntity {
}

我是否还必须设置
选择BeforeUpdate=true
?或者,这会触发一个附加的选择,而不需要,因为我已经在<代码> @事务性< /代码>中选择了实体,并且您认为“<代码> @动态更新> /代码>的好处是大的吗?Hibernate必须动态地重新生成每个SQL语句的事实可以忽略不计吗?我们讨论的是字符串长度约为200个字符的实体记录,其中通常(例如)只更新一行中的一个数字(例如库存可用性)。关于selectBeforeUpdate=true,我认为您不应该使用它,但如果您指定它,最好看看实际会发生什么。关于动态更新,列编号与列值无关。好的,它大约是15列,您对此有何看法?我是否还必须设置
selectBeforeUpdate=true
?或者,这会触发一个附加的选择,而不需要,因为我已经在<代码> @事务性< /代码>中选择了实体,并且您认为“<代码> @动态更新> /代码>的好处是大的吗?Hibernate必须动态地重新生成每个SQL语句的事实可以忽略不计吗?我们讨论的是字符串长度约为200个字符的实体记录,其中通常(例如)只更新一行中的一个数字(例如库存可用性)。关于selectBeforeUpdate=true,我认为您不应该使用它,但如果您指定它,最好看看实际会发生什么。关于动态更新,重要的是列数而不是列值。好的,大约是15列,您对此有何看法?