使用Java,Hibernate将唯一行插入数据库表

时间:2013-08-08 09:06:14

标签: java database hibernate unique

我不知道这是否已被问过。但我找不到任何人。 (无论如何,这对我的项目来说不是必需的。但是当我使用数据库和Hibernate时,我有一个疑问,现在有时间在这里问。所以我到目前为止还没有尝试过我将要问的问题)

假设我的数据库中有表。我想在表中插入数据,但只插入Unique行。

怎么可能?

从,this SO Qestion,我认为,我们可以在数据库中插入唯一的行。

所以在Java中,使用PreparedStatement,我们是否能够传递相同的查询,这样只有当该行在表中是唯一的时才会插入行?

如果可能, ERROR / EXCEPTION,Java 会抛出什么?

如果不可能,最好的方法是什么?

如果我们使用hibernate还怎么样?我们怎么能这样做?

如果我传递 bean类对象来保存字段,我该如何检查唯一行?

如何使用对象列表执行相同的操作?

希望每个人都能理解这种情况。

2 个答案:

答案 0 :(得分:1)

Hibernate在对象标识符(id)上工作,如果对象已经有标识符,那么hibernate会尝试更新该对象而不是插入。

您可以使用简单的解决方案,例如:从db获取主ID上的对象,如果对象存在提取标识符,则将标识符设置为新对象,它将被更新,如果对象不存在则将插入并使用“saveOrupdate”

来自hibernate docs:

Hibernate用户请求了一种通用方法,该方法通过生成新标识符来保存瞬态实例,或者更新/重新附加与其当前标识符关联的分离实例

saveOrUpdate()执行以下操作:

  • 如果对象在此会话中已经持久,则不执行任何操作

  • 如果与会话关联的另一个对象具有相同的标识符,则抛出异常

  • 如果对象没有标识符属性,则保存()

  • 如果对象的标识符具有分配给新实例化对象的值,则保存()

  • 如果对象是由or或版本化的,并且version属性值是分配给新实例化对象的相同值,则save()否则update()对象

答案 1 :(得分:1)

  

所以在Java中,使用PreparedStatement,我们能够传递相同的内容   查询,以便只有在该行中唯一的行才会插入行   表

如果您为表中的字段设置了唯一约束,则无法插入重复项。

  

如果可能,Java会抛出什么ERROR / EXCEPTION?

您的数据库会引发错误;类似的东西:

Duplicate entry 'xxxx' for key 'whatever'

希望你的java应用程序能够以某种方式从数据库中提出错误......

  

如果我传递bean类对象来保存字段,我该怎么办?   检查唯一行?

     

如何使用对象列表执行相同操作?

如果您正在操作bean,则只需覆盖equals()并在插入多行时使用java.util.Set而不是List

无论如何,像@Muel一样说:“在数据库级别而不是应用程序级别强制执行唯一性会好得多。”以免永远在数据库中获取损坏的数据。但是,在bean中覆盖equals并检查是否没有两个(或更多)相同的对象也很容易。