избежать дублирования с помощью ключа автоинкремента в Hibernate - PullRequest
1 голос
/ 24 марта 2010

Я пытаюсь использовать Hibernate для автоматического увеличения идентификатора, однако стараюсь избегать дублирования.

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


// setter and getter
}

Чего я хочу достичь, так это того, что всякий раз, когда новый объект службы, который я хочу сохранить, имеет то же имя и владельца (независимо от того, являются ли инкрементные поля данных одинаковыми или нет), чем любой из существующих в базе данных, он будет дублированная запись. В этом случае я больше не хочу добавлять еще одну запись в базу данных. Как исправить файлы hbm.xml, чтобы избежать этой проблемы?

Ответы [ 3 ]

2 голосов
/ 25 марта 2010

Вы можете использовать аннотации, чтобы сделать то же самое.

В верхней части вашего класса сущностей вы пишете следующее:

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

// setter and getter
}

Это сообщит hibernate, что имя столбца и владелец должны быть уникальными вместе.

1 голос
/ 25 марта 2010

Если вам нужен столбец id, вы можете сохранить его. Что вам нужно * уникальное ограничение на уровне базы данных для обоих столбцов.

(если вы используете инструмент hbmtoddl, вам может понадобиться что-то подобное:

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

)

Таким образом, вы не можете вставлять дубликаты данных.

После этого, если вы не хотите, чтобы ваш код ломался при попытке вставить дубликаты, вам нужно

  • поиск по имени и владельцу (если вы делаете это часто, индекс может быть хорошей идеей)
  • если вы не нашли запись, вставьте ее
  • Вы также можете перехватить исключение, генерируемое в случае нарушения уникального ограничения (да, это все еще может произойти, если два потока вставляют данные одновременно) и повторить выбор.
1 голос
/ 25 марта 2010

У вас есть несколько вариантов:

  • определите ваш первичный ключ как composite-id или natural-id
  • перед сохранением используйте запрос, чтобы найти, есть ли еще строка с таким же именем и владельцем, и если есть - получите.

В любом случае вы должны переопределить hashCode() и equals(..), используя name и owner

...