如何通过JPA持久保存从JTable中检索的实体对象?

时间:2013-02-04 22:51:03

标签: java jpa jtable

我几天来一直试图从导入的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 =&gt; [211参数绑定]   查询:InsertObjectQuery(entity.Mauranagroup [respondentId = 5])

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

  

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

我不明白是它,它实际上是持久的,我可以看到我保存的数据。它是循环还是循环不能很好地终止,因为这个项目我真的生病了。

1 个答案:

答案 0 :(得分:0)

您的表上有一个数据库约束,某些列是唯一的,并且您要插入重复值。我想这是RESPONDENT_ID。如果您是第一次尝试在表中保留所有记录,我将不会从表数据中提供id。相反,我会使用序列为您生成id并将其返回到UI。

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

顺便说一句。最好在开头用小写字母命名方法。