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);
}
問題はまだ存在します。