0

解決策が見つからないように見える問題があります。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();
    }

私はこれを正しい方法で行っていますか、それとも別の方法で設定する必要がありますか? 私が欠けているものについての洞察をうそつきます。

4

1 に答える 1