Hibernate:如何编写不是主键的复合唯一键的映射?

时间:2012-04-13 03:38:30

标签: hibernate hibernate-mapping hibernate3-maven-plugin

我有一个文件,我在计票。我想限制每个用户在特定比赛中进行一次投票。用户可以返回并更改他/她的投票,但它会更新竞争对手的选择。

我无法弄清楚如何使用Hibernate映射文件来完成此操作。 (编程语言是Java。)

我已经看过使用composite-id了,但是如果我以后需要它,我希望在这个东西上有一个典型的数字主键。 (我也无法弄清楚如何做到这一点!=)

这是我的映射文件,我从中生成模型对象和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 个答案:

答案 0 :(得分:0)

我认为应该在数据库上强制执行约束,而不是在应用程序代码中强制执行约束。在将来的某个时刻,您正在编写的应用程序可能不是针对此数据运行的唯一代码,如果另一个应用程序未强制执行相同的约束,则数据已损坏。数据和数据结构也可能会超出您的应用程序代码。因此,我认为强制执行此类约束的正确位置在数据库中。

答案 1 :(得分:0)

通过以下方式更改从投票到用户的映射将解决问题。在映射中添加unique =“true”应该有效。

答案 2 :(得分:0)

在Hibernate使用嵌入式数据库(HSQL or H2)的情况下,数据库中的实现不会起作用。在这种情况下,当hibenate访问模型层以实现其db结构时,将在运行时抛出唯一的键声音。

最好以满足unique=true的方式使用主键。投票给@Ram