我知道关于这个问题已经有一些问题,但我认为这个问题是不同的。
@Entity
public class foo{
@Id
@GeneratedValue
private long id;
@Version
private long version;
private String description;
...
}
稍后,我使用JPA all()从存储库中获取all;我从列表中选择一个对象并更改描述。
然后我想使用JPA merge()更新存储库中的对象(参见代码)。
这里的问题是,它在我第一次尝试更改描述时起作用(版本值现在是2)。第二次,将引发一个OptimisticLockException表示该对象同时被更改。
//First: persist is tried, if the object already exists, an exception is raised and then this code is executed
try {
tx = em.getTransaction();
tx.begin();
entity = em.merge(entity);
tx.commit();
} catch (PersistenceException pex) {
//Do stuff
}
B.ChangeDescription(“Something New!”);
//调用更新方法(合并代码已过帐)
下面是一篇文章,它很好地解释了何时抛出optimisticlockException
。
此外,仅供将来参考,当您正在更新实体,但希望在此事务结束时使用EntityManager
上的Detach
方法在DB端进行更改时,您可以使JPA避免对实体进行内存中的验证:
em.detach(employee);
除了捕获异常和重试之外,还有更好的方法来更新版本化实体吗?下面是代码 输出如下:Hibernate:插入员工(佣金、姓名、版本、员工id、输入日期)值(?、?、?、?、?)Hibernate:在员工(佣金、姓名、版本、员工id、输入日期)中插入值(?、?、?、?、?)Hibernate:在员工(佣金、姓名、版本、员工id、输入日期)中插入值(?、?、?、?、?)Hibernate:在员工(佣金、姓
异常[EclipseLink-48](Eclipse Persistence Services-2.3.2.v20111125-r10461):org.Eclipse.Persistence.exceptions.Description异常描述:字段[flight.connid]存在多个可写映射。只有一个可以定义为可写,所有其他的都必须指定为只读。映射:org.eclipse.persistenc
我已经尝试使用Spring Boot+Spring Data JPA更新实体很久了。我得到所有正确的观点回到我。我的编辑视图按ID向我返回正确的实体。一切进展顺利。直到我实际尝试保存/合并/持久化对象。每次我拿回一个有新ID的新实体。我只是不知道为什么。我看了网上的例子,还有你可能会参考的重复问题的链接。那么,在这些代码中,我在哪里犯了错误呢? 在这段代码之后。我的视图将我返回到正确的URL,但I
我与以下实体类有一个双向的一对多关系: 当然,所有必需的级联选项都是在客户端设置的。但如果在引用现有产品订单时首次持久化新创建的客户端(如本场景所示),则它将不起作用: 已创建并持久化产品订单“%1”。工作正常。 已创建客户端“%2”,并将产品订单“%1”添加到其产品订单列表中。然后它被持久化。不起作用。 我尝试了几个apporach,但没有一个显示出预期的结果。请参阅下面的结果。我在这里阅读了所
我在表EmployeeCode的两列上有一个主键 主键(ecode,eid) 列eid是一个外键,它引用表Employee并具有ManytoOne映射,我已经在EmployeeCode.java中声明了如下内容 当我这样做时,我得到以下异常,因为我在这两个位置都使用了EID(因为它是另一个表的外键,也是复合主键的一部分) 我怎么能在两个地方都用同一个名字呢?
我也可以使用,但它有与@data相同的问题。 为了解决的问题,我可以为字段编写自己的私有setter来重写生成的setter。但也许有更好的办法?这种情况下的最佳实践是什么?