2013-05-04 66 views
0

我有问题,我无法找到解决方案。我有两个一对多的关系。如何从一位父母中检索所有的孩子

UserEntity是父类 - 这个类有一个孩子的父母。该类也是一个自引用类。

@Entity 
    @Table(name = "user") 
    @Component 
    public class UserEntity implements Serializable { 
     @Id 
     @GeneratedValue(strategy = GenerationType.IDENTITY) 
     @Basic(optional = false) 
     @Column(name = "user_id") 
     private Integer id; 

     @ManyToOne(cascade={CascadeType.ALL}) 
     @JoinColumn(name="checker_id") 
     private UserEntity checker; 

     @OneToMany(mappedBy="checker", orphanRemoval=true, cascade = CascadeType.ALL) 
     private Set<UserEntity> setters = new HashSet<UserEntity>(); 

     @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="setter") 
     private Set<Module> sModule = new HashSet<Module>(); 

     @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="checker") 
     private Set<Module> cModule = new HashSet<Module>(); 

所以在课堂上,与作为父母的Checker作为孩子的一对多关系。反过来,Checker和Setter都是Module类的父母。设置者将负责设置模块,而检查者将检查它是否正确。所以两者都与相同的模块相关联。

模块

@Entity 
@Table(name = "modules") 
@Component 
public class Module implements Serializable{ 

     @ManyToOne(fetch=FetchType.LAZY) 
     @JoinColumn(name="user_id", insertable=false, updatable=false) 
     private UserEntity setter; 

     @ManyToOne(fetch=FetchType.LAZY) 
     @JoinColumn(name="checker_id", insertable=false, updatable=false) 
     private UserEntity checker; 
     ///getters and setters 

所以每个用户我想列出与之相关的模块。因此,在设置器部分,模块将显示在其特定页面上,而在检查器部分,相应模块也将列出。

我试图通过获取id的用户并自动获取模块来做到这一点。在这种情况下,父母是setter(我正在使用setsModule)。但该方法返回null。

@Transactional 
@SuppressWarnings("unchecked") 
public UserEntity getWithModules(Integer id){ 

    //Retrieve User 
    Criteria crit = getCurrentSession().createCriteria(UserEntity.class); 
    crit.add(Restrictions.eq("id", id)); 
    UserEntity userEntity = get(crit); 

    //Retrieve the modules for the setter 
    crit = getCurrentSession().createCriteria(Module.class); 

    crit.add(Restrictions.eq("id", id)); 

    crit.addOrder(Order.asc("moduleId")); 
    Set<Module> sModule = new LinkedHashSet<Module>(crit.list()); 
    userEntity.setsModule(sModule); 

    return userEntity; 
} 

以上

public T get(Criteria criteria) { 
    return (T)criteria.uniqueResult(); 
    } 

我要对这个正确的方式还是我必须将它设置不同的方法的DAO标准码?我会对我缺少的东西有所洞察。

回答

0

您不应该使用条件查询来通过ID获取实体。有一种方法:Session.get()。而且由于你的实体之间有联系,所以没有理由使用查询来获得这个联系。

如果我理解正确的话,你需要的是:

UserEntity userEntity = (UserEntity) session.get(UserEntity.class, id); 

而获得的setter模块,你只需要简单地调用

userEntity.getSModules(); 

而且拿到检查模块,你需要致电

userEntity.getCModules(); 
+0

嗨,谢谢你的建议。我创建了一个通过id获取用户的方法,并使用 - userEntity.getsModule返回用户。用模块请求用户导致错误 - 必需整数参数'userId'不存在 – user2259555 2013-05-04 10:46:51

相关问题