我正在尝试将复合主键添加到类中并遇到一些麻烦。这是课程。
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作为主键的长值?
更新了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>
答案 0 :(得分:2)
使用String series
和int userId
定义组合键,并为令牌中的用户指定连接列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>