Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “休眠错误”;“未找到对象”;使用@inheritation和Joined策略_Java_Hibernate_Jpa_Table Per Class_Table Per Subclass - Fatal编程技术网

Java “休眠错误”;“未找到对象”;使用@inheritation和Joined策略

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

我有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;
   ...
}
我正在使用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=?