У меня есть следующие сопоставления сущностей для моего приложения EJB3, которые отображают отношение «многие ко многим»:
@Entity
Crawl{
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.crawl")
public List<Change> changes;
}
@Entity
Change{
@EmbeddedId
ChangePK pk;
@Temporal(javax.persistence.TemporalType.DATE)
Date changeDate;
}
@Embeddable
ChangePK{
@ManyToOne
Crawl crawl;
@ManyToOne
Page page;
}
@Entity
Page{
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.page")
List<Change> changes;
}
Я пытаюсь получить все изменения, связанные с сканированием, и упорядочить их по дате, используя:
this.entityManager
.createQuery("SELECT c FROM Change c WHERE
c.pk.crawl.id = :id
ORDER BY c.changeDate DESC")
.setParameter("id", crawl.getId());
Это дает мне ошибку переполнения стека. Я полагаю, что нетерпеливая выборка может иметь к этому какое-то отношение, но в любом другом случае я хочу, чтобы изменения загружались при сканировании, и это вызовет много проблем в остальной части моего приложения, если я изменю тип выборки на ленивый.
Я переопределил hashCode
и equals
методы для каждого класса.
Edit:
hashcode
и equals
код:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Crawl other = (Crawl) obj;
if (id != other.id)
return false;
return true;
}
Они сгенерированы Eclipse, и я выбрал для них первичные ключи, остальные классы используют одно и то же.