Java “休眠错误”;“未找到对象”;使用@inheritation和Joined策略
我有3个Java类(BaseEntity、User、Role),它们在Hibernate中正常工作。用户和角色都是BaseEntity的子类。我有一个用于我的用户的表和一个用于我的角色的表。有一个用于将用户映射到角色的联接表。使用的所有注释都是Java “休眠错误”;“未找到对象”;使用@inheritation和Joined策略,java,hibernate,jpa,table-per-class,table-per-subclass,Java,Hibernate,Jpa,Table Per Class,Table Per Subclass,我有3个Java类(BaseEntity、User、Role),它们在Hibernate中正常工作。用户和角色都是BaseEntity的子类。我有一个用于我的用户的表和一个用于我的角色的表。有一个用于将用户映射到角色的联接表。使用的所有注释都是javax.persistence注释 @MappedSuperclass public abstract class BaseEntity { private String id; private Timestamp entityCreati
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;
...
}
我正在使用Hibernate 4.2.19
如您所见,Hibernate正试图从authority表中选择name属性的值,这是正确的,但随后却抱怨该表中不存在该列
如何解决此问题 我不知道是否可以在同一实体层次结构中混合继承策略。@Boutaya Bilal:在同一实体层次结构中混合继承策略是可能的,但在JPA规范之外,因此支持取决于JPA提供程序。您在Authority类中缺少@entity注释。但是,让我告诉你,几年前,我用Hibernate 3.6对混合继承策略进行了概念验证,我发现它至少对这个版本不起作用。@Wypipeprz:我认为只使用SecondaryTable注释是可能的。好的,所以我把错误描述错了。错误在于Hibernate确实尝试从正确的表中进行选择,但该表似乎没有指定的列。当查看调试日志时,我可以清楚地看到该列被添加到authorities表中,并且Hibernate成功地完成了验证过程。我发现只有我的集成测试失败了。在构建和部署我的应用程序时,我可以成功地查询权限和角色对象……我不知道是否可以在同一实体层次结构中混合继承策略。@Boutaya Bilal:在同一实体层次结构中混合继承策略是可能的,但超出了JPA规范,因此,支持依赖于JPA提供程序。您在Authority类中缺少@Entity注释。但是,让我告诉你,几年前,我用Hibernate 3.6对混合继承策略进行了概念验证,我发现它至少对这个版本不起作用。@Wypipeprz:我认为只使用SecondaryTable注释是可能的。好的,所以我把错误描述错了。错误在于Hibernate确实尝试从正确的表中进行选择,但该表似乎没有指定的列。当查看调试日志时,我可以清楚地看到该列被添加到authorities表中,并且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;
...
}
[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=?