Java 如何有效地更新数据库中的实体?
每当应用程序中的实体包含与DB实体不同的数据时,我希望更新数据库中的实体 我的更新方法如下: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
@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列,您对此有何看法?