避免在 Hibernate 中使用自动递增键重复

发布于 2024-08-26 23:43:17 字数 327 浏览 8 评论 0原文

我正在尝试使用 Hibernate 自动递增 id,但是,我尝试避免重复。

class Service
{
    Long id; // auto increment
    String name;
    String owner;
    Boolean incremental;


// setter and getter
}

我想要实现的是,每当我要保存的新服务对象与数据库中任何现有服务对象具有相同的名称和所有者(无论数据字段增量是否相同)时,它将是一个重复条目。在这种情况下,我不想再向数据库中添加另一个条目。如何修改 hbm.xml 文件以避免此问题?

I am trying to use Hibernate to auto increment the id, however, I try to avoid duplication.

class Service
{
    Long id; // auto increment
    String name;
    String owner;
    Boolean incremental;


// setter and getter
}

What I want to achieve is, whenever the new service object I want to save has the same name and owner(no matter if the data field incremental are the same or not) as any of the existing one in the database, it will be a duplicated entry. In this case, I don't want to add another entry into the Database anymore. How to revise the hbm.xml files to avoid this issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

女中豪杰 2024-09-02 23:43:17

您可以使用注释来执行相同的操作。

在实体类之上,您编写以下内容:

@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "name","owner"}))
@Entity
class Service
{
    Long id; // auto increment
    String name;
    String owner;

// setter and getter
}

这将告诉 hibernate 列名和所有者应该是唯一的。

You can use annotations to do the same.

On top of your entity class you write the following:

@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "name","owner"}))
@Entity
class Service
{
    Long id; // auto increment
    String name;
    String owner;

// setter and getter
}

This will tell hibernate that the columns name and owner should be unique together.

殊姿 2024-09-02 23:43:17

如果您需要 id 列,可以保留它。
你需要的是
* 数据库级别对两列的唯一约束。

(如果你使用hbmtoddl工具,你可能需要类似的东西:)

<properties name="key" unique="true">
    <property name="name" .../>
    <property name="owner" .../>
</properties>

这样

,你就不能插入重复的数据。

,则需要

  • 按名称和所有者进行查找(如果您经常这样做,索引可能是一个好主意)
  • 之后,如果您不希望在尝试插入重复项时破坏代码,则如果找不到该条目 ,插入它,
  • 您可能还想捕获在违反唯一约束的情况下引发的异常(是的,如果两个线程同时插入数据,仍然可能发生)并重试选择。

If you need the id column, you can keep it.
What you need is
* a unique constraint at the database level on both columns.

(if you use hbmtoddl tool, you may need something like that :

<properties name="key" unique="true">
    <property name="name" .../>
    <property name="owner" .../>
</properties>

)

This way, you can not insert duplicates data.

After that if you don't want your code to break when you try to insert duplicates, you need to

  • lookup by name and owner (if you do that often, an index might be a good idea)
  • if you don't find the entry, insert it
  • you might also want to catch the exception thrown in case of unique constraint violation (yes that may still happen if two threads are inserting data at the same time) and retry a select.
纵性 2024-09-02 23:43:17

您有多种选择:

  • 将主键定义为 composite-idnatural-id
  • 在保存之前,使用查询查找是否有另一行具有相同的名称和所有者,如果有的话 - 得到它。

无论哪种方式,您都应该使用 nameowner 覆盖 hashCode()equals(..)

You have a number of options:

  • define your primary key as a composite-id or natural-id
  • before saving, use a query to find if there is another row with the same name and owner, and if there is - get it.

Either way you should override hashCode() and equals(..) using name and owner

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文