我已经尝试了数天,无法持久保存从导入的Excel工作表中的jtable获取的数据,但是没有成功,并且试图查找异常令人作呕。
这是部分代码和错误堆栈跟踪
@Action
public void persist(){
emf = Persistence.createEntityManagerFactory("MauranaSurveyPU");
em = emf.createEntityManager();
em.getTransaction().begin();
//loops through table to retrieve object and persist
int count = jTable1.getRowCount();
for(int i=0; i<count; i++){
Mauranagroup mn = new Mauranagroup();
String obj1 = (String)GetData(jTable1,i,0);
String obj2 = (String)GetData(jTable1,i,1);
String obj3 = (String)GetData(jTable1,i,2);
//set entity
mn.setRespondentId(Integer.parseInt(obj1));
mn.setMale(obj2);
mn.setFemale(obj3);
em.persist(mn);
}//end for
em.getTransaction().commit();
}//end method persist
// get object from jtable
private Object GetData(JTable jTable1, int x, int y) {
return jTable1.getModel().getValueAt(x,y);
}
此代码的问题在于它实际上仍然存在,但是在事务提交之后
我得到了这个堆栈跟踪;
内部异常:java.sql.SQLIntegrityConstraintViolationException:该语句被中止,因为它会导致在“ MAURANAGROUP”上定义的“ SQL130204062549290”标识的唯一或主键约束或唯一索引中重复键值。
错误代码:20000
致电:INSERT INTO MAURANAGROUP(RESPONDENT_ID,AMOUNTTOBESPENT,AREYOUFAMILIARNO
绑定=> [211个参数绑定]
查询:InsertObjectQuery(entity.Mauranagroup [responseentId = 5])
当我删除记录并再次坚持时,我得到另一行
绑定=> [211个参数绑定]
查询:InsertObjectQuery(entity.Mauranagroup [responseentId = 2])
在org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
我不明白,它实际上仍然存在,我可以看到我保存的数据。是循环还是循环终止得不好,由于这个项目,我实际上生病了。
最佳答案
表上有一个数据库约束,其中某些列是唯一的,并且您要插入重复值。我猜是RESPONDENT_ID
。如果您是第一次尝试将表中的所有记录持久化,那么我不会提供表数据中的ID。相反,我将使用序列为您生成ID并将其返回到UI。
如果您要修改表中存储的现有数据。我会使用ID在数据库中搜索它们,更新字段并再次保存它们。
顺便说一句最好在开头用小写字母命名您的方法。