Play framework 2.0 尝试级联删除时出错“参数“#1”未设置;SQL语句:delete”
Posted
技术标签:
【中文标题】Play framework 2.0 尝试级联删除时出错“参数“#1”未设置;SQL语句:delete”【英文标题】:Play framework 2.0 Error when attempting to cascade delete "Parameter "#1" is not set; SQL statement: delete " 【发布时间】:2012-08-30 07:13:06 【问题描述】:我的示例中的完整错误行是“[PersistenceException: org.h2.jdbc.JdbcSQLException: Parameter "#1" is not set; SQL statement: delete from class4 where (class3_id) in (?) [90012-158 ]]"
这发生在我的单元测试中,所以决定创建一个测试项目来尝试重现它,它确实做到了。
基本上我有 1-4 类,每个类都与一个单机有关,我尝试创建它们,然后按 1,2,3,4 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();
我的导致错误的应用程序代码运行如下
Class1 class1 = new Class1();
Class1.create(class1);
Class2 class2 = class1.add();
class1.add();
Class2.delete(class2);
Class1.delete(class1);
我还附上了一个示例应用程序,显示它正在发生,如果有人能指出我做错了什么,或者如果有人知道我可以如何解决它,如果这是 API 的错误,我将非常感激。
http://stowelly.co.uk/play-2.0.3-persistence-test.zip
谢谢
【问题讨论】:
【参考方案1】:这似乎是 Ebean 中的一个错误
http://www.avaje.org/bugdetail-420.html
无论如何,解决这个问题的临时解决方法是每个类删除函数中的以下代码
@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();
【讨论】:
【参考方案2】:请勿在您的实体中使用 @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);
简单的解释是事务存在,因此如果出现问题,它可以回滚。这是为了防止一半持久化的东西,在示例中B
被提交,A
不存在,B
是数据库中的非引用条目。
【讨论】:
以上是关于Play framework 2.0 尝试级联删除时出错“参数“#1”未设置;SQL语句:delete”的主要内容,如果未能解决你的问题,请参考以下文章
级联删除,同一张表,Entity Framework 4 Code First
如何在 Play Framework 2.0 中使用相对路径访问资源文件?