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