【发布时间】:2017-11-17 09:22:05
【问题描述】:
我遇到了以下问题。
我有一个看起来像这样的实体:
@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<>();
}
现在我有两种查找方法:
- 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 网络服务方法,一种用于返回所有教师的方法,另一种用于在加载学生的情况下按 id 返回一位教师的方法。
现在,当我调用 web 服务方法返回所有教师时,当然会抛出 LazyInitializationException,因为教师实体已经分离。
现在这是我的问题。除了为此实体创建 DTO 之外,还有其他选择吗?
如果我为学生集合设置@XMLTransient,当我为详细的教师调用webservice方法时,我也会隐藏它。
如果你能帮我解决这个问题,那就太好了……我尝试了很多,我知道它可以通过使用 jackson-datatype-hibernate 与 REST 一起工作。但它必须是 SOAP 网络服务。
【问题讨论】:
标签: java hibernate soap lazy-loading