簡體   English   中英

Hibernate:如何為不是主鍵的復合唯一鍵編碼映射?

[英]Hibernate: how do I code the mapping for a composite, unique key that isn't the primary key?

我有一個要點票的文件。 我想將每個用戶的票數限制在給定的競賽中。 用戶可以返回並更改他/她的投票,但是它將更新比賽中競爭對手的選擇。

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

我認為應該在數據庫上而不是在應用程序代碼中強制執行約束。 在將來的某個時候,您編寫的應用程序可能不是唯一針對此數據運行的代碼,如果另一個應用程序未執行相同的約束,則數據已損壞。 數據和數據結構也很有可能會超出您的應用程序代碼。 因此,我認為在數據庫上執行這種約束的正確位置。

通過以下方式將映射從“投票”更改為“用戶”將解決此問題。 在映射中添加unique =“ true”應該可以。

如果Hibernate使用嵌入式數據庫( HSQL or H2 ),則無法在數據庫中實現。在這種情況下,當hibenate訪問模型層以實現其db結構時,將在運行時拋出唯一的密鑰沖突。

最好以滿足unique=true的方式使用主鍵。為@Ram投票

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM