2010-12-07 116 views
1

我有一些要导入的记录。他们第一次插入时没关系。如果我尝试再次导入相同的数据,我收到一个org.postgresql.util.PSQLException:错误:重复键值违反了唯一性约束。如果数据相同/或更改,如何更新数据库中的记录,如果是使用JDBC的新数据,如何插入?使用JDBC插入或更新表格

public void store(Object entity) throws Exception { 
    try { 
     if (this.updateEntity((XEntity) entity) == 0) { 
      this.insertEntity((XEntity) entity); 
     } 

     ... 

    } catch (SQLException sqlEx) { 
     ... 
    } 
} 

private int updateEntity(XEntity entity) throws SQLException { 
    PreparedStatement prepStmt = this.getUpdatePreparedStmt(); 
    ... 
    return prepStmt.executeUpdate(); 
} 

private void insertEntity(XEntity entity) throws SQLException { 
    ... 
    this.getInsertPreparedStmt().executeUpdate(); 
} 

现在问题得到修复。我在下面提供了一个答案。

+0

什么是XEntity? – 2010-12-07 07:51:56

+1

您似乎处于实施的相当早期阶段。你有没有考虑使用JPA或Hibernate来处理持久性?是否有任何需要低级别JDBC访问的特定要求? – 2010-12-07 07:56:13

+0

你应该想出为什么“this.updateEntity((XEntity)entity)== 0”。 – pinichi 2010-12-07 08:00:48

回答

0

该测试逻辑有效。

if (this.updateEntity((XEntity) entity) == 0) { 
    this.insertEntity((XEntity) entity); 
} 

问题在于更新记录的方法。更新准备语句中的WHERE子句使用了不同的数据(包含空格的数据),因此updateEntity将始终返回0.这就是为什么只有插入而不是更新的原因。非常感谢您的帮助。

1

您可以尝试使用Postgres的SQL“合并”或“替换”

0

您可以通过UPDATE命令通过JDBC字符串。根据this SO帖子,您将不得不编写2条语句。

0

如果您想使用相同的方法来插入和更新数据,您需要先检查数据是否存在。用于插入新对象的SQL命令是INSERT,而用于更新元素的SQL命令是UPDATE。所以,你可以做的是做一个SELECT来检查你的数据是否已经在这里,然后根据结果做一个INSERTUPDATE

但是,这是一种解决方法。你真的需要澄清你的实现,并且不管你是添加还是更新数据,都要制作不同的方法。在商业方面,这显然是两种截然不同的功能,所以在我看来,一种方法似乎就是设计问题。