2016-03-11 2 views
1

Мои объекты: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 или мое мышление?

Спасибо

+1

Поскольку отображение «LAZY», я считаю, что вы должны видеть два дополнительных запроса на выбор, которые запускаются при вызове 'c.getInvoices(). Size();' и 'c.getReceipts(). Size();' соответственно , Можете ли вы проверить, что такое запрос, который запускается для 'receipts'. Для этого включите свойство 'show_sql'. –

+0

Попробуйте добавить '@Fetch (FetchMode.SELECT)' или '@Fetch (FetchMode.SUBSELECT)' в '@ OneToMany' аннотации. – Gwaeron

+0

Это длинный снимок, но попробуйте переименовать атрибут customer в одном из ваших классов, а также их соответствующее значение mappedBy ... –

ответ

0

Глядя на журнал спящего режима SQL я обнаружил, что дополнительное отображение @ManyToOne в Квитанция Entity виноват.

Я добавил optional = true для отображения, и теперь я получаю правильный размер набора рецептов.

Хотя я думаю, что это должно было сработать без него, потому что в документе Java указано, что по умолчанию по умолчанию используется значение true.

Смежные вопросы