2016-05-24 2 views
2

У меня есть тройная связь в моей базе данных: Пользователь, Книга и Книжный магазин. Сущности JPA определены следующим образом:JPA Entity не обновляется до перезагрузки сервера

class Book { 
    @Id 
    @Column(name = "ID") 
    private Integer id; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "book") 
    private Collection<BookOrder> bookOrderCollection; 
    .... 
} 

class User { 
    @Id 
    @Column(name = "ID") 
    private Integer id; 

    @OneToMany(mappedBy = "reader") 
    private Collection<BookOrder> bookOrderCollection; 
    .... 
} 

class BookOrder { 
    @JoinColumn(name = "BOOK_ID", referencedColumnName = "ID") 
    @ManyToOne 
    private Book book; 

    @PrimaryKeyJoinColumn(name = "READER_ID", referencedColumnName = "ID") 
    @ManyToOne 
    private User reader; 
    .... 
} 

Когда я хочу сохранить, я просто сделать это:

Book book = ...; 
User reader = ...; 
BookOrder order = new BookOrder(); 
order.setBook(book); 
order.setReader(reader); 
book.getBookOrderCollection().add(order); 
reader.getBookOrderCollection().add(order); 
book.setQuantity(book.getQuantity() - 1); 
bookFacade.edit(book); 

И BookFacade класс:

class BookFacade { 
    public void create(Book entity) { 
     getEntityManager().persist(entity); 
     getEntityManager().flush(); 
    } 

    public void edit(Book entity) { 
     getEntityManager().merge(entity); 
    } 

    public void remove(Book entity) { 
     getEntityManager().remove(getEntityManager().merge(entity)); 
    } 

    public Book find(Object id) { 
     return getEntityManager().find(Book.class, id); 
    } 
} 

Это отлично работает в что количество книг обновляется в базе данных и вставляется BookOrder. Тем не менее, UserbookOrderCollection не обновляется до перезапуска сервера (когда я извлекаю считыватель из базы данных).

Я хочу избежать выполнения usersFacade.edit(reader), потому что это не безопасно для создания двух транзакций за одну операцию. Вместо этого я добавил cascade = Cascade.ALL в поле reader в классе Order, но это не решило проблему.

Как я могу заставить его работать в течение одной транзакции?

+0

Что такое сущность BookOrder? – mvera

+0

Как ограничить ваши транзакции? – mvera

+0

BookOrder - это объект, который представляет заказ книги. У него есть книга orderd, читатель и другие поля: адрес, цена и т. Д. – nrofis

ответ

2

@OneToMany(cascade = CascadeType.ALL, mappedBy = "book") - обратное отношение, а не прямое. Возможно, добавление CASCADE к другой стороне (@ManyToOne) отношения будет иметь другой эффект.

+0

. Предложение - это ответ, хотя, добавляя слияние каскадов, будут выбраны изменения в книге и пользователе и синхронизироваться с базой данных. Без каскадного слияния JPA видит только изменения в bookOrder, а не изменения в книжных книгах Book Book. Пока база данных будет обновлена, объекты Book и Order в кеше не будут, и их коллекции не покажут изменения до тех пор, пока они не будут обновлены или не будет очищен кеш – Chris

+1

@ Крис, есть разница между «ведет к решению проблемы »и« является ответом на вопрос ». Этот ответ может быть первым, но это не последний. Если бы ваши комментарии были частью ответа, то это было бы более убедительным ответом. –

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