Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
Java 乐观主义者即使使用@Version_Java_Orm_Playframework_Timestamp_Ebean - Fatal编程技术网

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


我做错了什么

我可以从这里看到一些问题:

  • 您正在使用两个版本字段。我不知道这对Ebian是否合适,但通常一个就足够了。此外,我认为Ebean将自行管理这些字段,因此最好指定一个您不想使用的版本字段(一个int作为计数器或上次更改的时间戳)
  • 您正在调用
    update
    ,但似乎您确实在创建一个新事务,因此您应该使用
    Ebean.save
  • 关于错误,当您尝试更新在加载记录和更新之间发生更改的记录时,会引发该异常。为了查明记录已更改,Ebean使用版本列中的值

    因此,代码中的更新将生成类似以下内容的SQL:

    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)