我遇到一个@OneToMany映射问题,无法正确应用属于它的注释的参数。更具体地说,我有一个Parent_Table,它与Subjects_Table有一个@OneToMany关系。当工作正常并且可以访问Subjects时,它将生成查询并将查询打印到服务器上,例如:
SELECT id, other, random, column, names, parent_id FROM Subjects WHERE (parent_id = ?) ORDER BY id DESC
bind => [66]
我遇到的问题有时是从字面上打印出来的:
SELECT id, other, random, column, names, parent_id FROM Subjects
我已经尽了最大的努力来确认这不是日志中的问题,它已经发生了很多次,并且当它发生时,查询通常需要花费相当长的时间才能执行。 / p>
因此,在大多数情况下,它具有WHERE子句,其中包含被映射的By(@OneToMany的一部分)和@OrderBy批注信息,并且很少加载整个表。这个假设是通过从数据库查看网络并从网络查看到应用程序服务器来支持的,我从未真正地手动复制日志所说的内容。它似乎也独立于实际的数据库数据(即,如果父ID 1发生问题,父ID 1可能没有第二次出现问题,并且环境变量尽可能接近)。
实际上,当您第一次进入循环(如果调试工具值得信赖)时,查询实际上触发了一个“ for(Subjects主题:entity.getSubjects())”调用,这与延迟加载的属性所期望的一样。我相信实际查询是在org.eclipse.persistence.indirection.IndirectList.buildDelegate中的某个位置执行的,但我不确定100%,因为似乎在其中进行调试会中断正在打印的服务器日志。
EclipseLink 2.7.4
示例Parent_Table:
@Entity
@Table(name = "parent")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "dtype")
public abstract class Parent_Table extends Another_Table implements Parent {
@OneToMany(mappedBy = "entity", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@OrderBy("id DESC")
@DetailColumn(Subjects.class)
private List<Subjects_Table> subjects;
@Override
public DetailList<Subjects_Table> getsubjects() {
if (subjects == null) {
subjects = Lists.newArrayList();
}
return DetailLists.newDetailArrayList(Subjects_Table.class, subjects);
}
@Override
public void setSubjects(List<? extends Subjects> subjects) {
this.subjects = CollectionUtils.copy(subjects);
}
}
Subjects_Table示例:
@Entity
@Table(name = "subjects")
public class Subjects_Table implements Subjects {
@ManyToOne(fetch = FetchType.LAZY)
@ParentColumn
@JoinColumn(name = "parent_id", nullable = false)
private Subjects_Table entity;
}
我试图将上面的代码简化为仅相关的代码。
我希望注释始终应用于查询,即使它“失败”,我也没有任何错误消息,因为失败只是加载了整个表。