1

几天来,我一直在尝试保存从导入的 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

bind => [211 个参数绑定] 查询:InsertObjectQuery(entity.Mauranagroup[ respondentId=5 ])

当我删除记录并再次保留时,我得到另一行

bind => [211 个参数绑定] 查询:在 org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324) 处的 InsertObjectQuery(entity.Mauranagroup[ respondentId=2 ])

我不明白是吗,它实际上仍然存在,我可以看到我保存的数据。是循环还是循环没有很好地终止,我实际上是因为这个项目而生病了。

4

1 回答 1

0

您的表上有一个数据库约束,即某些列是唯一的,并且您正在插入重复值。我猜是RESPONDENT_ID. 如果您是第一次尝试持久化表中的所有记录,我不会提供表数据中的 id。相反,我会使用序列为您生成 id 并将其返回给 UI。

如果您尝试修改存储在表中的现有数据。我会使用 id 在数据库中搜索它们,更新字段并再次保存它们。

顺便提一句。在开头使用小写字母命名您的方法是一个好习惯。

于 2013-02-04T23:46:48.943 回答