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 作为父级,Setter 作为子级。反过来,Checker 和 Setter 都是 Module 类的父级。setter 将负责设置模块,而 checker 将检查它是否正确。所以两者都与同一个模块相关联。

模块

 @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

因此,对于每个用户,我想列出与他们关联的模块。因此,在 setter 部分中,模块将显示在其特定页面上,而在 checker 部分中,也会列出相应的模块。

我试图通过 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;
}

上述方法的 DAO 标准代码

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

我是否以正确的方式进行此操作,还是必须以不同的方式进行设置?我会对我所缺少的东西有所了解。

4

1 回答 1

0

您不应使用条件查询按 ID 获取实体。有一种方法:Session.get(). 而且由于您的实体之间存在关联,因此也没有理由使用查询来获取此关联。

如果我理解正确,您只需要:

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

而要获取设置器模块,您只需调用

userEntity.getSModules();

要获取检查器模块,您只需调用

userEntity.getCModules();
于 2013-05-04T07:15:14.013 回答