Hibernate:如何为非';这不是主键吗?

Hibernate:如何为非';这不是主键吗?,hibernate,hibernate-mapping,hibernate3-maven-plugin,Hibernate,Hibernate Mapping,Hibernate3 Maven Plugin,我有一个文件,我在那里计票。我想限制每个用户在给定的竞争中只能投一张票。用户可以返回并更改其投票,但会更新竞争对手的选择 我不知道如何使用Hibernate映射文件来实现这一点。(编程语言是Java。) 我已经研究过使用复合id,但是如果以后需要的话,我希望在这个东西上有一个典型的数字主键。(我也不知道该怎么做!) 这是我的映射文件,我从中生成模型对象和SQL: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC

我有一个文件,我在那里计票。我想限制每个用户在给定的竞争中只能投一张票。用户可以返回并更改其投票,但会更新竞争对手的选择

我不知道如何使用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>

受保护的
真的

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

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


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


最好以满足
unique=true
的方式使用主键。投票支持我希望这两个地方都有主键。我使用Hibernate工具生成我的模式。这可能会有所帮助。我现在更好地理解了你的帖子。(我没有投反对票。)此后,我开始手工制作模式DDL。我的Java代码可以捕获异常并在应用程序级别适当地处理它。您能提供更多关于如何做到这一点的信息吗?