3

Layer他のエンティティ ( ) のリストをマップするエンティティ ( )がありMemberます。このリストには、エントリが含まれていないか、存在しない可能性がありますnull。それでも、エンティティを照会するとNOT NULL check constraint、データベースからエラーが発生します。NamedQueriesでクエリすればDBからEntityを読み込めるので につながっているようidです。

@Entity
@NamedQueries({
    @NamedQuery(name="getChildLayers",-
                query = "SELECT la
                         FROM Layer la
                         WHERE la.parent = :parent AND la.deletedDate IS NULL")})
public class Layer extends CommonModel {
    /*... other field */
    @ManyToOne(fetch = FetchType.LAZY, targetEntity = Layer.class, optional = true)
    private Layer parent;

    @ManyToMany(fetch = FetchType.LAZY, targetEntity = MyUser.class)
    private List<MyUser> members;
    public List<MyUser> getMembers() {
        return members;
    }
    public void setMembers(List<MyUser> members) {
        this.members = members;
    }
    /*... other getters and setters */
}

次のエラーが表示されます。integrity constraint violation: NOT NULL check constraint; SYS_CT_10298 table: LAYER_MYUSER column: MEMBERS_ID

ただし、エントリを作成することはできます。

テストを実行すると、エンティティを読み取るすべてのテストが失敗します (ただし、作成は機能します)。作成方法に次の行を追加すると:

  layer.setMembers(new ArrayList<MyUser>());

次に、メンバーの変更をテストするメソッドが機能します (つまり、リストに要素を追加したり削除したりすることで、 を作成しLayerて変更することができます)。members

に何もないときはいつでも、データベースからのエンティティの読み取りが失敗するように私には思えMemberますLayer

フィールドに追加しようとし@JoinColumn(nullable=true)ましたが、何も変わりませんでした。

javax.persistenceクラスをインポートします。

変数にアクセスする方法の例 ( LayerService)

// this method works as expected
public Layer getById(Long id) {
    Session s = sessionFactory.getCurrentSession();
    return (Layer)s.get(Layer.class, id);
}

// this does not.
public List<Layer> getChildren(Layer layer) {
    Query childrenQuery = sessionFactory.getCurrentSession().getNamedQuery("getChildLayers");
    childrenQuery.setParameter("parent", layer);

    return (List<Layer>) childrenQuery.list();
}

Jason Cs の回答後にコードが変更されました。

Layer

...
private final List<OCWUser> members = new ArrayList<>();
...
public void setMembers(List<OCWUser> members) {
    this.members.clear();
    this.members.addAll(members);
}

問題はまだ存在します。

4

2 に答える 2