6

我正在尝试向一个类添加一个复合主键并且遇到了一些麻烦。这是课程。

class User {
    private long id;
    ...
}

class Token {
    private User user;
    private String series;
    ...
}

我正在使用 orm.xml 来映射类,因为它们实际上是我不想依赖于 JPA 的更高级别 API 的一部分——它有许多实现。

这里是:

...
<entity class="User">
    <attributes>
        <id name="id">
            <generated-value strategy="AUTO"/>
        </id>
        ...
    </attributes>
</entity>

<entity class="Token">
    <id-class class="TokenPK"/>
    <attributes>
        <id name="series"/>
        <id name="user"/>
        <many-to-one name="user"/>
    </attributes>
</entity>

最后,为了让这一切正常工作,我创建了 TokenPK 类,它看起来像这样:

public class TokenPK implements Serializable {

    private String series;
    private User user;

    public TokenPK() {
    }

    public TokenPK(String series, User user) {
        this.series = series;
        this.user = user;
    }

    public String getSeries() {
        return series;
    }

    public void setSeries(String series) {
        this.series = series;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        RememberMeTokenPK that = (TokenPK) o;

        if (!series.equals(that.series)) return false;
        if (!user.equals(that.user)) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = series.hashCode();
        result = 31 * result + user.hashCode();
        return result;
    }
}

我遇到的问题是 Hibernate 抱怨它无法创建 mysql 表,因为在没有密钥长度的密钥规范中使用了“BLOB/TEXT 列‘用户’”。

我的问题实际上是这些列首先被存储为 BLOB。直到我把 id-class 放进去之前它工作得很好,用户是通过它的 id 链接的。如何让 Hibernate 使用它用作主键的用户 id 的 long 值?

更新了 orm.xml:

<entity class="Token">
    <id-class class="TokenPK"/>
    <attributes>
        <id name="series"/>
        <id name="user">
            <column name="userId"/>
        </id>
        <many-to-one name="user">
            <join-column name="userId" insertable="false" updatable="false"/>
        </many-to-one>
    </attributes>
</entity>
4

1 回答 1

2

String series用and定义复合键,并int userId在 Token 中为 User 指定一个 join-column id。我认为您还必须添加 insertable="false"、updatable="false"。

 <composite-id name="TikenPK" class="yourpackage.TokenPK"> 
        <key-property name="series" column="series" type="string" />
        <key-property name="userId" column="userId" type="integer"/>
       </composite-id> 
于 2009-11-12T14:55:53.960 回答