0

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

我不知道如何使用 Hibernate 映射文件来做到这一点。(编程语言是 Java。)

我已经研究过使用复合 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>
4

3 回答 3

0

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

于 2012-04-13T04:06:31.893 回答
0

通过以下方式将映射从投票更改为用户将解决问题。在映射中添加 unique="true" 应该可以工作。

于 2012-04-13T05:56:07.133 回答
0

在 Hibernate 使用嵌入式数据库(HSQL or H2)的情况下,数据库中的实现将无法工作。在这种情况下,当 hibernate 访问模型层以实现其 db 结构时,将在运行时抛出唯一键破坏。

unique=true更好地以满足.Vote up for @Ram的方式使用主键

于 2015-03-26T10:14:12.887 回答