2016-12-12 6 views
0

今後の使用のために汎用の@MappedSuperclassを定義しています。私の経験では、すべてのカテゴリに同じコードがあります。次に、私は一般的なカテゴリと複数のサブクラスを作成できると思います。しかし、休止状態は子をフェッチすることはできず、PageCategoryを更新することはできません。私はそれが無効であるか、または休止状態のバグであることを知る必要がありますか?@Entityでジェネリック型を使用できますか?

@MappedSuperclass 
@Cacheable 
public abstract class Category<T extends Category> { 

private Integer id; 

private String name; 

private T parent; 

private List<T> children; 

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

@Transient 
public T getParent() { 
    return parent; 
} 

public void setParent(T parent) { 
    this.parent = parent; 
} 

@Transient 
public List<T> getChildren() { 
    return children; 
} 

public void setChildren(List<T> children) { 
    this.children = children; 
} 
} 

@Entity 
@Table(name = "pageCategory") 
public class PageCategory extends Category<PageCategory> implements Serializable { 

@ManyToOne 
@Override 
public PageCategory getParent() { 
    return super.getParent(); 
} 

@OrderBy("name asc") 
@OneToMany(mappedBy = "parent") 
@Override 
public List<PageCategory> getChildren() { 
    return super.getChildren(); 
} 
} 
+0

投稿した内容は、そのフィールドがルートに一時的(永続的ではない)であり、サブクラスで永続的になりたいことを示唆しています。これが何を意味するのかを確認してください。ジェネリックの使用はJPAモデルで可能でなければなりません –

+0

@NeilStockton私はいくつかのサブクラスが親子継承を無視できると思います。私の場合、PageCategoryはgetterメソッドをオーバーライドします。 – hurelhuyag

+0

あなたの質問は、サブクラスで使用するときにTRANSIENTアノテーションをオーバーライドできると思ったら、ジェネリックスやあなたと関係することとは何の関係もありません。おそらくあなたの質問を書き換えて –

答えて

0

@Entityでジェネリックを使用することはできますが、あなたの場合はジェネリッククラスは必要ありません。

オーバーライドされたメソッドは、より具体的な戻り値の型を持つことがあります。つまり、新しい戻り値の型が、オーバーライドしているメソッドの戻り値の型に代入可能である限りです。

public class A {  
    public A get(){ 
     return null; 
    }  
    public List<? extends A> list(){ 
     return null; 
    } 
} 

public class B extends A{ 
     @Override 
     public B get() { 
      return null; 
     } 

     @Override 
     public List<B> list(){ 
      return null; 
     } 
    } 
+0

と言います。これは "共変リターンタイプ"と呼ばれています:http://stackoverflow.com/questions/1882584/what-is-a-covariant-return-type –

関連する問題