Как сделать несколько колонн UniqueConstraint в HBM?
-
02-10-2019 - |
Вопрос
Работа на некоторых устаревших гибернационном коде.
Как я могу сделать следующее с помощью HBM.xml (файл сопоставления Hibernate) вместо с аннотациями?
@Table(name="users", uniqueConstraints = {
@UniqueConstraint(columnNames={"username", "client"}),
@UniqueConstraint(columnNames={"email", "client"})
})
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private int id;
private String username;
private String email;
private Client client;
}
Решение
Использовать properties
ярлык:
...
<properties name="uk1" unique="true">
<property name="username" .../>
<many-to-one name="client" .../>
</properties>
<properties name="uk2" unique="true">
<property name="email" .../>
<many-to-one name="client" update="false" insert="false" .../>
</properties>
...
Экстракт документации:
Тоu003Cproperties> Элемент позволяет определению именованной логической группировки свойств класса. Наиболее важное использование конструкции состоит в том, что он позволяет комбинацию свойств быть целью свойства. Это также удобный способ определить уникальное ограничение нескольких столбцов.
Все доступные варианты описаны в Hibernate Documentation.
Другие советы
Вы также можете сделать это:
<many-to-one name="client" unique-key="uk1,uk2" .../>
<property name="username" unique-key="uk1" .../>
<property name="email" unique-key="uk2" .../>
Вам не нужно использовать тег в HBM. Если вы хотите только несколько уникальных ограничений.
Вы можете добавить такой же атрибут уникального ключа двум разным столбцам. Это создаст композитный уникальный ключ.
<property name="firstName" column="first_name" unique-key="name" />
<property name="lastName" column="last_name" unique-key="name" />
В приведенном выше примере уникальный ключ будет создан как в столбце First_Name, так и для столбца Last_Name.