Ошибка гибернации "объект не найден" с использованием @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 из таблицы прав доступа, что является правильным, но затем жалуется, что этот столбец не существует в этой таблице.
Как мне исправить эту проблему?