Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 分离的JPA对象未填充版本字段_Hibernate_Jpa_Persistence_Spring Roo - Fatal编程技术网

Hibernate 分离的JPA对象未填充版本字段

Hibernate 分离的JPA对象未填充版本字段,hibernate,jpa,persistence,spring-roo,Hibernate,Jpa,Persistence,Spring Roo,我正在使用Roo1.2.1、JPA2和Hibernate3.6连接到MSSQL数据库 我有一个web服务,它接受JSON并将其解析为一个实体;显然,@Version列将是0,因为调用服务的人对此一无所知。当我第一次调用merge()时,它工作正常。对象被正确持久化,版本列被设置为1。但下次我使用相同的数据调用web服务时,它会说该对象已过时,这在技术上是正确的,因为版本始终为0 他们传递给我们的ID保证是唯一的,所以我们使用它作为主键 我想这应该由实体经理负责 所以我的问题是:如果不先从数据库加

我正在使用Roo1.2.1、JPA2和Hibernate3.6连接到MSSQL数据库

我有一个web服务,它接受JSON并将其解析为一个实体;显然,@Version列将是0,因为调用服务的人对此一无所知。当我第一次调用merge()时,它工作正常。对象被正确持久化,版本列被设置为1。但下次我使用相同的数据调用web服务时,它会说该对象已过时,这在技术上是正确的,因为版本始终为0

他们传递给我们的ID保证是唯一的,所以我们使用它作为主键

我想这应该由实体经理负责

所以我的问题是:如果不先从数据库加载所有实体,然后更新字段,然后重新持久化它们,我如何处理这个问题?这似乎是一种黑客行为;也许我走错了方向

我的实体如下所示:

@RooJavaBean
@RooToString
@RooJson
@RooJpaActiveRecord(table = "MYTABLE", persistenceUnit = "myPersistenceUnit",
    transactionManager = "myTransactionManager", versionField = "version", identifierColumn = "myIdField")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Entity
public class MyEntity {
  @Id
  @Column(name = "myIdField")
  private long myIdField;

  @Version
  @Column(name = "version")
  private long version;

  @Column("myColumn")
  private String someValue;
}

你必须决定你是否想要乐观锁定

如果您希望使用客户端发送的内容更新数据库,而不考虑从客户端获取对象到更新对象之间可能发生的并发更新,那么这意味着您不需要乐观锁定,并且实体中不应该有版本字段

如果您想要乐观锁定,那么版本应该是合并实体的一部分。这就是机制的工作原理:它检查保存的版本号是否与传递的版本号相同。所以如果你总是通过0,显然,它永远不会起作用


当然,最简单的方法是使其成为发送给客户机和由客户机发送的JSON对象的一部分。您也可以想象将给定实体的版本(发送到客户端以备将来更新,因此密钥将是clientId entityId)存储在内存中或数据库表中,但这将更难实现。

不幸的是,Roo强制您使用@version字段,所以我有点受不了。我不知道Roo,但我在一篇论坛帖子中读到,如果你将versionField设置为“”,它将被忽略。这毫无意义。您需要传递从数据库加载实体时的对象版本。如果对从客户机收到的内容进行散列,则显然与存储在数据库中的内容不同,除非客户机没有修改任何内容。此外,我认为字符串不能用作版本字段。