1

Hibernate で正しく動作する 3 つの Java クラス (BaseEntity、User、Role) があります。User と Role はどちらも BaseEntity のサブクラスです。ユーザー用のテーブルとロール用のテーブルがあります。ユーザーをロールにマッピングするための結合テーブルがあります。使用されるすべての注釈はjavax.persistence注釈です。

@MappedSuperclass
public abstract class BaseEntity {
   private String id;
   private Timestamp entityCreation;
   private Timestamp entityUpdate;
   ...
}

@Entity
@Table(name="roles")
public class Role extends BaseEntity {
   private String description;
   private String name;
   ...
}

@Entity
@Table(name="users")
public class User extends BaseEntity {
   private String username;
   private String password;

   @ManyToMany( cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }, fetch = FetchType.LAZY )
   @JoinTable( name = "users_roles", joinColumns = { @JoinColumn( name = "user_id" ) }, inverseJoinColumns = { @JoinColumn( name = "role_id" ) } )
   private Set<Role> roles;
   ...
}

さまざまな理由から、モデルを拡張し、Role のスーパークラスを作成する必要があります。このスーパークラスには自己参照が必要です。私の考えは、ここで結合された戦略で @Inheritance アノテーションを使用することでしたが、Hibernate からエラーが発生し続けます。私が読んだことから、Hibernate は、スーパークラスから属性を取得するために結合を行う必要があることを理解する必要があります。

@Entity
@Table("authorities")
@Inheritance(strategy=InheritanceType.JOINED)
public class Authority extends BaseEntity {
   private String name;

   @ManyToMany( cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }, fetch = FetchType.LAZY )
   @JoinTable( name = "authorities_includes", joinColumns = { @JoinColumn( name = "authority_id" ) }, inverseJoinColumns = { @JoinColumn( name = "include_id" ) } )
   private Set<Authority> includes;
   ...
}

@Entity
@Table(name="roles")
public class Role extends Authority {
   private String description;
   ...
}

私が得ているエラー:

[警告] [18:30:04.004] [] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL エラー: -5501、SQLState: 42501 [エラー] [18:30:04.004] [] org.hibernate.engine .jdbc.spi.SqlExceptionHelper - ユーザーに権限がないか、オブジェクトが見つかりません: ROLE1_.NAME

Hibernate SQL 出力:

[DEBUG] [18:30:04.004] [] org.hibernate.SQL - 
    select
        roles0_.user_id as user_id1_22_1_,
        roles0_.role_id as role_id2_23_1_,
        role1_.id as id1_18_0_,
        role1_.entity_creation as entity_c2_18_0_,
        role1_.entity_update as entity_u3_18_0_,
        role1_.name as name4_18_0_ 
    from
        odm_users_roles roles0_ 
    inner join
        odm_roles role1_ 
            on roles0_.role_id=role1_.id 
    where
        roles0_.user_id=?

休止状態 4.2.19 を使用しています

ご覧のとおり、Hibernate は権限テーブルから name 属性の値を選択しようとしていますが、これは正しいのですが、その列がそのテーブルに存在しないと不平を言っています。

この問題を解決するにはどうすればよいですか?

4

0 に答える 0