我有问题,我似乎无法找到解决方案。我有两个具有一对多关系的类。
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();
}
我是否以正确的方式进行此操作,还是必须以不同的方式进行设置?我会对我所缺少的东西有所了解。