Ошибка гибернации "объект не найден" с использованием @Inheritance с объединенной стратегией

У меня есть 3 Java-класса (BaseEntity, User, Role), которые работают правильно с Hibernate. И пользователь, и роль являются подклассом 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;
   ...
}

По разным причинам мне нужно расширить мою модель и иметь суперкласс для роли. Этот суперкласс должен иметь ссылку на себя. Моя идея состояла в том, чтобы использовать аннотацию @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=?

Я использую Hibernate 4.2.19

Как вы можете видеть, Hibernate пытается выбрать значение атрибута name из таблицы прав доступа, что является правильным, но затем жалуется, что этот столбец не существует в этой таблице.

Как мне исправить эту проблему?

0 ответов

Другие вопросы по тегам