Hibernate: как мне кодировать сопоставление для составного уникального ключа, который не является первичным ключом?

У меня есть файл, в котором я считаю голоса. Я хочу ограничить каждого пользователя одним голосом в данном соревновании. Пользователь может вернуться и изменить свой голос, но это обновит выбор участника в конкурсе.

Я не могу понять, как это сделать, используя файлы сопоставления Hibernate. (Язык программирования - Java.)

Я рассмотрел использование составного идентификатора, но я хочу иметь типичный первичный ключ для этой вещи, если он понадобится мне позже. (Я также не мог понять, как заставить это работать! =)

Вот мой файл сопоставления, из которого я генерирую объекты модели и SQL:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.example.project.model.db.Vote" table="vote">

        <id name="voteId" type="int">
            <meta attribute="scope-set">protected</meta>
            <meta attribute="use-in-equals">true</meta>
            <generator class="native" />
        </id>
        <many-to-one name="user" column="userId" unique="false" not-null="true" lazy="false"
            class="com.example.project.model.db.User"
        />
        <many-to-one name="competition" column="competitionId" unique="false" not-null="true" lazy="false"
            class="com.example.project.model.db.Competition"
        />
        <many-to-one name="competitor" column="competitorId" unique="false" not-null="true" lazy="false"
            class="com.example.project.model.db.Competitor"
        />
        <property name="dateAdded" type="date" not-null="true" />
    </class>
</hibernate-mapping>

3 ответа

Измените отображение с Голосовать на Пользователя следующим образом, чтобы решить проблему. add unique="true" в отображении должно работать.

Реализация в базе данных не будет работать в случае Hibernate с использованием встроенной базы данных (HSQL or H2). В таких случаях во время выполнения генерируется уникальный ключ, когда hibenate обращается к уровню модели для реализации его структуры БД.

Лучше использовать первичный ключ способом, который удовлетворяет unique=trueГолосовать за Ram Reddy

Я думаю, что ограничение должно быть применено к базе данных, а не к коду вашего приложения. В какой-то момент в будущем приложение, которое вы пишете, может быть не единственным кодом, работающим с этими данными, если другое приложение не применяет такое же ограничение, что данные повреждены. Также вероятно, что данные и структура данных превысят ваш код приложения. Таким образом, я бы сказал, что правильное место для применения этого типа ограничений находится в базе данных.

Другие вопросы по тегам