0

我仍在处理一个非 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 文件中的一个简单修复,它将使我的错误消失。

4

1 回答 1

0

我相信这个问题是由于 hbm.xml 被认为是“完整的”,所以我认为它首先被导入并验证。尝试摆脱 hbm.xml,这应该会消失。

于 2021-09-06T18:54:47.857 回答