Java 乐观主义者即使使用@Version
我试图在我的Java 乐观主义者即使使用@Version,java,orm,playframework,timestamp,ebean,Java,Orm,Playframework,Timestamp,Ebean,我试图在我的游戏中使用Ebean更新数据库中的一行!框架程序 下面是我要更新的实体的类 Transaction.java @Entity @Table(name = "transactions") public class Transaction extends Model{ @Id @GeneratedValue public int id; @OneToOne @JoinColumn(name = "car_fk") public Car
游戏中使用Ebean
更新数据库中的一行!框架
程序下面是我要更新的实体的类
Transaction.java
@Entity
@Table(name = "transactions")
public class Transaction extends Model{
@Id
@GeneratedValue
public int id;
@OneToOne
@JoinColumn(name = "car_fk")
public Car car;
@OneToOne
@JoinColumn(name = "user_lender_fk")
public User user;
@Version
public Timestamp from_date;
@Version
public Timestamp to_date;
public boolean availability; // true -> Available.
public String status;
}
下面是我用来更新它的方法:
Transaction transaction = new Transaction();
transaction.car = concernedCars.get(i);
transaction.user = currentUser;
transaction.from_date = Tools.StringAndroidToTimestamp(dateFrom);
transaction.to_date = Tools.StringAndroidToTimestamp(dateTo);
transaction.status = Constants.WAITING_FOR_ANSWER;
try{
Ebean.update(transaction);
}catch(OptimisticLockException e){
Logger.info(e.toString());
}
如果需要,我的方法是将字符串
转换为时间戳
:
当然,我有一个惊人的错误:
javax.persistence.OptimisticLockException:数据已更改。更新
[0]行sql
我做错了什么 我可以从这里看到一些问题:
update
,但似乎您确实在创建一个新事务,因此您应该使用Ebean.save
UPDATE transactions
SET car_fk=<SOME_VAL>, ...
WHERE id=null AND from_date=<OTHER_VAL> AND to_date=<ANOTHER_VAL>
更新事务
设置car_fk=。。。
其中id=null,from_date=和to_date=
不会更新任何记录并引发异常
我之所以发布这些信息,是因为我不知道在Play附带的Ebean版本中禁用乐观锁定的简单方法可以处理的方法很少 1) 在类名之前使用@EntityConcurrencyMode(ConcurrencyMode.NONE) 2) 使用原始更新查询。(首选)
由于同一个ebean.update抛出乐观锁异常,我面临了太多的问题,最后我执行了原始更新查询,它对我有效 我有另一个解决这个问题的方法 您可以使用:
@EntityConcurrencyMode(ConcurrencyMode.NONE)
在实体类中
这将禁用乐观锁定并发修改检查
新的sql查询将是:
更新表名集合PARAM1=?其中ID=
EntityConcurrencyMode在包中提供包com.avaje.ebean.annotation 如果我将
@Version
放在Id字段中,可以吗?不可以。添加一个名为Version的新列,您可以忘记它there@EntityConcurrencyMode最新版本“ebean 8.2.3”(与sbt play ebean 3.1.0版一起使用)中不再使用
@EntityConcurrencyMode(ConcurrencyMode.NONE)