次の問題があります。JPA LazyLoadingコレクションはSOAP経由で転送されました
@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Teacher{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "teacherId", referencedColumnName = "id", nullable = false)
private final Set<Student> students = new HashSet<>();
}
今私が持っている2つのファインダー・メソッド:
- findAllTeachers():
SELECT t from Teacher t
- findTeacherByIdWithDetails(ロングID)
私はこのようになりますエンティティを持っています:SELECT t from Teacher t JOIN FETCH t.students s where t.id = :id
私がサーバー側にいる限り、すべてが良好です。 私はwildfly 10アプリケーションサーバーでHibernateを使用しています。
私は2つのSOAP Webサービスメソッドを持っています。すべての教師を返すメソッドと、読み込まれた学生がIDで1人の先生を返すメソッドです。
もちろん、Teacher Entityがすでにデタッチされているため、すべての教師を返すためにwebserviceメソッドを呼び出すと、LazyInitializationExceptionがスローされます。
ここに私の質問があります。このエンティティのDTOを作成する以外の選択肢はありますか? 学生用コレクションに@XMLTransient
を設定している場合は、詳細な教師用のWebサービスメソッドを呼び出すときにも隠しています。
この問題で私を助けることができればとてもうれしいです...私はたくさん試しましたが、それはjackson-datatype-hibernateを使ってRESTで動作することが分かりました。しかし、SOAP Webサービスであることが必要です。
は、あなたの答えバティストいただきありがとうございますBeauvais、 残念ながら私は例外が発生しました: java.util.Setはインタフェースですが、JAXBはインタフェースを処理できません: -/ So私はラッパークラスを使用しようとしましたが、Setの標準出力のような出力を生成することはできません。 – Johnny90
'XmlAdapter'を作成してTeacherクラスをWrapperにしようとすると、ここではすべてのクラシックメンバーをコピーし、それを渡す前に上記のようにHibernateのものを特別に扱います。 –