当前位置: 首页 > 知识库问答 >
问题:

如何在通过jpa crud存储库保存时排除列?

涂选
2023-03-14

我有一个相当大的实体,有许多字段和几个与该实体交互的方法。当两个线程同时从数据库中读取数据时,存在不可重复读取的问题,其中一个线程更改了一个字段并保存了实体,而另一个线程同时读取了旧值的数据并没有更改并保存。我想的第一个解决方案是将事务隔离级别改为可重复读取,但这可能会对我的应用程序的性能产生巨大影响。我只需要在第二个方法中忽略一个字段,但在第一个方法中更改它,所以@transient注释在这里不合适。在这两种情况下,我都有相同的@entity类,并通过默认的CrudRepository方法save(entity)保存数据,因此我无法选择要更新的字段和不更新的字段。第二个想法是从实体中移除那个有问题的字段,创建一个新的实体,它首先扩展,然后将那个字段放在那里。之后,在我想与该字段交互的情况下使用扩展实体,在我不想与该字段交互的情况下使用基实体。这是个好主意吗?

共有1个答案

荣轶
2023-03-14

是否允许两个线程都继续进行,即使一个线程没有看到另一个线程所做的更改(换句话说,一个线程中修改的数据是否独立于另一个线程中修改的数据)?

如果是这样,您可以使用@dynamicupdate。这样,Hibernate将只更新事实上已经修改的字段,而不覆盖任何其他字段。

如果不是,您可以使用锁定来同步线程。

 类似资料:
  • 我有以下课程: DBEntity.java 使用者JAVA 用户服务。JAVA UserRepository.java

  • 问题内容: 此查询将保存完整的日期和时间。但我只想保存时间而不是数据库中的日期。有任何查询可以做到这一点吗? 问题答案: 您的列必须设置为DATETIME或TIMESTAMP。 如果使用TIME类型,则查询将按预期工作。 如果您使用任何其他类型的列,则可以使用其他答案提到的CURTIME()方法或CAST(column AS TIME),但是这会占用更多的磁盘空间,并且如果使用select会导致查

  • 问题内容: 我有这个存储过程。例如,如何间隔5秒运行一次?像删除时间戳超过一天的数据的例程一样? 问题答案: 您可以使用mysql Scheduler每5秒运行一次。您可以在以下网址找到示例:http://dev.mysql.com/doc/refman/5.1/en/create- event.html 从未使用过它,但我希望它能起作用:

  • 我已在登录时在本地存储中设置了身份验证令牌,并在注销时将其清除。注销后,如果用户尝试再次登录,则从缓存中获取旧的身份验证令牌,而不是新设置的值。如何在清除本地存储时清除缓存。我在应用程序中使用angular 2。 登录: 注销:

  • 无论如何,如果用户名已经被使用,存储库只需进行更新,因为指定的标识符不是空的。这不是我想要的行为,我需要它抛出类似重复条目异常的东西。有什么办法可以预防吗?我必须自己做吗?例如: