Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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

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
Java 尝试级联删除时播放框架2.0错误;参数"#1“;没有设定;SQL语句:删除";_Java_Jpa_Playframework 2.0_H2_Ebean - Fatal编程技术网

Java 尝试级联删除时播放框架2.0错误;参数"#1“;没有设定;SQL语句:删除";

Java 尝试级联删除时播放框架2.0错误;参数"#1“;没有设定;SQL语句:删除";,java,jpa,playframework-2.0,h2,ebean,Java,Jpa,Playframework 2.0,H2,Ebean,我的示例中的完整错误行是“[PersistenceException:org.h2.jdbc.JdbcSQLException:Parameter”#1”未设置;SQL语句:从class4中删除,其中(?[90012-158]] 这是在我的单元测试中发生的,所以我决定创建一个测试项目来尝试并复制它,它做到了 基本上,我有1-4类,每个类都与一个对象相关,我尝试创建它们,然后按顺序1,2,3,4,3,2,1删除它们,但是我得到了这个错误 除了数字之外,这些类都是相同的(最后一个类没有列表) @En

我的示例中的完整错误行是“[PersistenceException:org.h2.jdbc.JdbcSQLException:Parameter”#1”未设置;SQL语句:从class4中删除,其中(?[90012-158]]

这是在我的单元测试中发生的,所以我决定创建一个测试项目来尝试并复制它,它做到了

基本上,我有1-4类,每个类都与一个对象相关,我尝试创建它们,然后按顺序1,2,3,4,3,2,1删除它们,但是我得到了这个错误

除了数字之外,这些类都是相同的(最后一个类没有列表)

@Entity
public class Class1 extends Model{

/**
 * 
 */
private static final long serialVersionUID = 4322329984247299024L;

@Id
@GeneratedValue
public Long id;



@OneToMany(mappedBy="class1",cascade={CascadeType.PERSIST, CascadeType.ALL})
private List<Class2> class2s = new ArrayList<Class2>();

public Class2 add()
{
    Class2 class2 = new Class2(this);
    Class2.create(class2);
    return class2;
}


@play.db.ebean.Transactional 
public static void create(Class1 class1) {
    class1.save();
    }



  @play.db.ebean.Transactional 
 public static void delete(Class1 class1) {
      class1.delete();
    }
}
我还附上了一个示例应用程序,展示了它的发生,如果有人能指出我做错了什么,或者如果有人知道我如何解决它,如果它是API的一个bug,我将非常感激


谢谢

这似乎是Ebean中的一个bug

无论如何,在处理这个问题时,一个临时的解决方法是在每个类delete函数中使用以下代码

 @play.db.ebean.Transactional 
     public static void delete(Class2 class2)
  {  
     List<Class3> list = class2.getClass3s();
     for(int i = 0; i < list.size(); ++i)
     {
       Class3.delete(list.get(i));
     }  
     list.clear();
     class2.getClass1().getClass2s().remove(class2);
     class2.delete();
    }
@play.db.ebean.Transactional
公共静态无效删除(Class2 Class2)
{  
List List=class2.getClass3s();
对于(int i=0;i
不要在您的实体中使用
@Transactional
之类的东西,而是在业务逻辑/持久性上使用它

@Entity
public class A
{
    Long id;
    List<B> bs;

    //...
}

public class DAO
{
    @Transactional
    public void addBtoA(A a, B b)
    {
         b = em.persist(b);
         a = em.find(a);
         a.addB(b);
         em.persist(a);
    }
}
@实体
公共A类
{
长id;
名单b;
//...
}
公共类DAO
{
@交易的
公共无效添加BTOA(A、B)
{
b=em.persist(b);
a=em.find(a);
a、 addB(b);
em.a;
}
}
简单的解释是,存在一个事务,以便在出现问题时可以回滚。这是为了防止提交半持久化的内容,在示例
B
中,
a
不存在,
B
是数据库中的非引用项

@Entity
public class A
{
    Long id;
    List<B> bs;

    //...
}

public class DAO
{
    @Transactional
    public void addBtoA(A a, B b)
    {
         b = em.persist(b);
         a = em.find(a);
         a.addB(b);
         em.persist(a);
    }
}