几天来我一直在尝试保存从导入的 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);
}
这段代码的问题在于它实际上仍然存在,但是在事务提交之后 我得到这个堆栈跟踪;
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL130204062549290' defined on 'MAURANAGROUP'. Error Code: 20000 Call: INSERT INTO MAURANAGROUP (RESPONDENT_ID, AMOUNTTOBESPENT, AREYOUFAMILIARNO
bind => [211 parameters bound] Query: InsertObjectQuery(entity.Mauranagroup[ respondentId=5 ])
当我删除记录并再次保留时,我得到另一行
bind => [211 parameters bound] Query: InsertObjectQuery(entity.Mauranagroup[ respondentId=2 ]) at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
我不明白是不是,它实际上持续存在,我可以看到我保存的数据。是循环还是循环没有很好地终止,我实际上因为这个项目而生病了。
最佳答案
您的表上存在数据库约束,某些列是唯一的,并且您正在插入重复值。我猜是 RESPONDENT_ID
。如果您第一次尝试保留表中的所有记录,我不会提供表数据中的 id。相反,我会使用序列为您生成 id 并将其返回到 UI。
如果您尝试修改表中存储的现有数据。我将使用 id 在数据库中搜索它们,更新字段并再次保留它们。
顺便说一句。在开头使用小写字母命名方法是一个很好的做法。关于java - 如何通过 JPA 持久化从 JTable 检索的实体对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14697224/