解決策が見つからないように見える問題があります。1対多の関係を持つ2つのクラスがあります。
UserEntity は親クラスです。このクラスには、1 つの子に対して 2 つの親があります。このクラスは、自己参照クラスでもあります。
@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>();
したがって、クラス内では、子としてのセッターに対する親としてのチェッカーとの 1 対多の関係があります。同様に、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でユーザーを取得し、モジュールを自動的に取得することで、これを実行しようとしました。この場合、親はセッターです (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();
}
私はこれを正しい方法で行っていますか、それとも別の方法で設定する必要がありますか? 私が欠けているものについての洞察をうそつきます。