Мои объекты:Hibernate OneToMany список пустых
Customer.class
@Entity
@Table(name="customer", schema = "pbis", catalog = "feivel")
public class Customer {
@Id
@Column(name = "customerid")
private long id;
...
@OneToMany(mappedBy = "customer", fetch = FetchType.LAZY)
private Set<Invoice> invoices;
@OneToMany(mappedBy = "customer", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<Receipt> receipts;
}
Invoice.class
@Entity
@Table(name="invoice", schema = "pbis", catalog = "feivel")
public class Invoice {
@Id
@Column(name = "invoicenumber")
private long invoiceNumber;
@ManyToOne
@JoinColumn(name = "customerid", insertable = false, updatable = false)
private Customer customer;
}
Receipt.class
@Entity
@Table(name = "receipts", schema = "pbis", catalog = "feivel")
public class Receipt {
@EmbeddedId
private ReceiptId id;
@ManyToOne
@JoinColumn(name = "customerid", insertable = false, updatable = false)
private Customer customer;
Простой Hibernate Query
SELECT c FROM Customer WHERE c.id = :id
я получаю правильный размер c.getInvoices().size();
Но c.getReceipts().size();
возвращает ноль
Когда я использую EclipseLink с тем же запросом, я получаю правильный размер обеих квитанций и счетов-фактур.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("eclipselink");
EntityManager em = emf.createEntityManager();
javax.persistence.Query q = em.createQuery("SELECT c FROM Customer c WHERE c.id = :id");
q.setParameter("id", Long.valueOf(event.getText()));
Использование критериев с ResultTransformer также дает мне правильный receipts.size
Criteria c = session.createCriteria(Customer.class);
c.add(Restrictions.eq("id", Long.valueOf(event.getText())));
c.setFetchMode("receipts", FetchMode.JOIN);
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
for (Object o : c.list()) {
Customer r = (Customer) o;
System.out.println(r.getReceipts().size());
}
Используя SELECT r FROM Receipt WHERE r.customer.id = :id
, я получаю правильный r.getCustomer()
но квитанции посаженные еще пуста.
Итак, где мой картографический wron или мое мышление?
Спасибо
Поскольку отображение «LAZY», я считаю, что вы должны видеть два дополнительных запроса на выбор, которые запускаются при вызове 'c.getInvoices(). Size();' и 'c.getReceipts(). Size();' соответственно , Можете ли вы проверить, что такое запрос, который запускается для 'receipts'. Для этого включите свойство 'show_sql'. –
Попробуйте добавить '@Fetch (FetchMode.SELECT)' или '@Fetch (FetchMode.SUBSELECT)' в '@ OneToMany' аннотации. – Gwaeron
Это длинный снимок, но попробуйте переименовать атрибут customer в одном из ваших классов, а также их соответствующее значение mappedBy ... –