我尝试使用 Ebean
更新数据库中的一行在我的Play! Framework
程序。
这是我要更新的实体的类。
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());
}
如果有必要,我的方法可以转换 String
至Timestamp
:
public static Timestamp StringAndroidToTimestamp(String s){
String toConvert = s.substring(0, s.length()-2);
Logger.info("ToConvert = "+toConvert);
Timestamp timestamp = null;
try{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parsedDate = dateFormat.parse(toConvert);
timestamp = new Timestamp(parsedDate.getTime());
}catch(Exception e){
Logger.info("Exception date = " +e.toString());
}
return timestamp;
}
当然,我得到了一个令人难以置信的错误:
javax.persistence.OptimisticLockException: Data has changed. updated [0] rows sql
我做错了什么?
最佳答案
有几种方法可以解决这个问题。
1) Use @EntityConcurrencyMode(ConcurrencyMode.NONE) before class name
2) Use raw update query.(preferred)
由于相同的 ebean.update 抛出乐观锁异常,我面临太多问题,最后我做了原始更新查询,它对我有用。
关于java - OptimisticLockException Ebean 即使使用@Version,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29393074/