我不知道这是否已被问过。但我找不到任何人。 (无论如何,这对我的项目来说不是必需的。但是当我使用数据库和Hibernate时,我有一个疑问,现在有时间在这里问。所以我到目前为止还没有尝试过我将要问的问题)
假设我的数据库中有表。我想在表中插入数据,但只插入Unique行。
怎么可能?
从,this SO Qestion,我认为,我们可以在数据库中插入唯一的行。
所以在Java中,使用PreparedStatement
,我们是否能够传递相同的查询,这样只有当该行在表中是唯一的时才会插入行?
如果可能, ERROR / EXCEPTION,Java 会抛出什么?
如果不可能,最好的方法是什么?
如果我们使用hibernate还怎么样?我们怎么能这样做?
如果我传递 bean类对象来保存字段,我该如何检查唯一行?
如何使用对象列表执行相同的操作?
希望每个人都能理解这种情况。答案 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
并检查是否没有两个(或更多)相同的对象也很容易。