我仍在处理一个非 Spring 遗留应用程序,它具有一个不容易更新的匹配遗留数据库,所以我必须处理发给我的卡片。
我正在将这个非 Spring 应用程序从 Hibernate 3 移动到 Hibernate 5,我遇到了一些问题,所以让我说他们有一个包含这三个类的 primary-hibernate.cfg.xml,按以下顺序:
<mapping class="com.app.server.model.user.UserRolePK" />
<mapping class="com.app.server.model.user.UserRole" />
<mapping resource="com/app/server/model/user/User.hbm.xml"/>
第一类定义如下:
public class UserRolePK implements Serializable {
@Column(insertable=false, updatable=false)
private Long userId;
@Column(name = "elt", insertable=false, updatable=false)
@Enumerated(EnumType.STRING)
private Role role;
// getters/setters/equals/hashcode/toString
}
主类如下所示:
@Entity
@Table(name="roles")
@IdClass(UserRolePK.class)
public class UserRole implements Serializable {
@Id
@ManyToOne(fetch = FetchType.LAZY, optional=false)
@JoinColumn(name = "userId", referencedColumnName = "id", insertable=false, updatable=false)
private User user;
@Id
@Column(name = "elt", insertable=false, updatable=false)
@Enumerated(EnumType.STRING)
private Role role;
// getters/setters/equals/hashcode/toString
}
我可以告诉你,我使用 UserRolePK 为 UserRole 创建了一个 Dao 类,它们 100% 工作。我可以毫无问题地访问数据库并从“角色”表中获取所有记录。所以,我知道这部分有效。
最后 User.hbm.xml 看起来像这样:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.app.server.model.user">
<class name="User" table="user">
<id name="id" column="id">
<generator class="native" />
</id>
<bag name="roles" cascade = "all,delete-orphan" lazy="false">
<key column="userId" not-null="true"/>
<one-to-many class="com.app.server.model.user.UserRole"/>
</bag>
// more properties not relevant at this time
</class>
</hibernate-mapping>
我认为这一切都很好,但是当我运行应用程序时出现错误。我得到这个讨厌的错误:
org.hibernate.boot.MappingException: Association [com.app.server.model.user.User.roles] references an unmapped entity [com.app.server.model.user.User.roles] : origin(com/app/server/model/user/User.hbm.xml)
at org.hibernate.boot.model.source.internal.hbm.ModelBinder$AbstractPluralAttributeSecondPass.bindCollectionTable(ModelBinder.java:3195)
at org.hibernate.boot.model.source.internal.hbm.ModelBinder$AbstractPluralAttributeSecondPass.doSecondPass(ModelBinder.java:3133) ...
more error messages
现在我正在以各种方式尝试“角色”,添加一个表格:
<bag name="roles" table="roles" cascade = "all,delete-orphan" lazy="false">
<key column="userId" not-null="true"/>
<one-to-many class="com.app.server.model.user.UserRole"/>
</bag>
或者,从包更改为设置:
<set name="roles" table="roles" cascade = "all,delete-orphan" lazy="false">
<key column="userId" not-null="true"/>
<one-to-many class="com.app.server.model.user.UserRole"/>
</set>
但这不起作用。我很想把所有的 hbm.xml 文件变成带注释的表,但是我正在处理的遗留应用程序已经定义了一个类:com.app.server.model.user.User 不幸的是,他们决定坚持一堆将业务逻辑转换为休眠实体。这个业务逻辑改变了事物的价值,我不会在这里做,所以我可能不得不把它改到其他地方。
希望这是 User.hbm.xml 文件中的一个简单修复,它将使我的错误消失。