当前位置: 首页 > 面试题库 >

JPA @Version:如何使用?

鲍俊杰
2023-03-14
问题内容
@Entity
public class Person {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private int salary;

    @Version
    private long version;

    // ...getters and setters
}
  1. 是否需要为创建setter / getter version
  2. 当使用Hibernate持久化该实体时,我不需要手动设置此值,对吗?
  3. 为了在Spring的服务器上使用乐观并发检查,我还需要配置hibernateTemplate.saveOrUpdate什么?是否支持所有数据库?
  4. 如何对该实体进行单元测试?在我的数据库中,所有显示版本字段的记录的值为0
  5. hibernateTemplate.saveOrUpdate每次调用都会增加版本值吗?

问题答案:

我会说:

  1. 必须设置/获取版本,因为有时您可能自己分配版本(从旧数据重新创建新实例时)
  2. 如果您从数据库中读取实例,则不需要。(在新代码中用代码创建它时,情况会有所不同)。
  3. 我什么也看不到。我从未遇到过数据库问题。
  4. 我认为单元测试不会进入数据库,因此涉及数据库的测试称为集成测试。您不应该过多地使用它们,因为它们速度很慢,并且它们并没有真正测试您的代码,但是更多的是Hibernate / Driver / Database代码…您应该信任它们,或者仅对其进行一次测试,但不能对于您所有的实体。
    要查看大于0的版本值,请在事务中读取/修改/更新您的实体,版本将增加一。退出交易,再做一次,价值增加…

  5. 每次修改数据库行时,版本都会增加。



 类似资料:
  • 问题内容: 我在Hibernate 3.6.x中使用JPA2 我对@Version进行了简单测试。 假设我们有2个实体, 实体团队具有玩家实体列表,双向关系,惰性获取类型,级联类型全部 两个实体都有@Version 这是场景: 每当对团队/球员实体之一进行修改时,刷新/提交时,团队/球员的版本就会增加(修改后的记录的版本会增加)。 使用persist将新的球员实体添加到团队的集合中,将在persi

  • 问题内容: 批注在JPA中如何工作? 我找到了各种答案,摘录如下: JPA使用实体中的版本字段来检测对同一数据存储记录的并发修改。当JPA运行时检测到尝试同时修改同一记录的尝试时,它将向尝试最后提交的事务抛出异常。 但是我仍然不确定它是如何工作的。 同样从以下几行开始: 您应该考虑版本字段是不变的。更改字段值会产生不确定的结果。 这是否意味着我们应该将version字段声明为? 问题答案: 但是我

  • 问题内容: 我是JPA和Hibernate的新手,我对乐观锁定有疑问。我有一个拥有@Version注释字段的类。当我更新此类所代表的实体时,版本计数器不会增加。这是我的代码:该类: 这是主要方法: 控制台的内容如下: 有人可以告诉我怎么了吗? 编辑: 好的,我尝试了一些。我已将锁定设置为LockModeType.OPTIMISTIC_FORCE_INCREMENT并收到以下错误消息: 因此,很明显

  • 为了测试@version注释,我使用以下设置来管理持久性: Spring Boot Starter 1.5.3.发布 Hibernate5.2.10.final Spring Data Envers 1.1.3.Release->Spring Data JPA 1.11.3.Release 测试的数据库: H2 PostgreSQL Mariadb 甲骨文 实体正在使用一个@version注释字段

  • 问题内容: 该EclipseLink的文件说,我需要在我的pom.xml与Maven得到它下面的条目: 但是当我尝试使用注释时,NetBeans告诉我,找不到该类。确实如此:Eclipselink的javax.persistence包中没有Entity类。 我必须如何使用Maven设置Eclipselink? 问题答案: 该工件不提供JPA 2.0 API ,您需要添加: 为了简单起见,我建议使用

  • 问题内容: 首先,我要说我是Java EE的新手,并且我在Java方面还没有扎实的理论背景。 我在掌握如何与Java 结合使用时遇到了麻烦。为了说明我发现的困难,我创建了一个非常简单的示例。 如果我有两个简单的接口和: 而一个实体,它实现还有一个它实现了: 我要如何在要保留上述两个实体之间的关系的方法中正确处理这种情况? 我要使用接口的主要原因是因为我想保持模块/层之间对公共接口的依赖性。我还要如