2013-05-04 86 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

相關問題