Я уже мог решить проблему, и это было связано с тем, как сущности сохранялись, и транзитивностью методов в приложении JavaEE.
При вызове бизнес-метода EJB, в котором классы сохраняются, по завершении этого метода транзакция завершается, поэтому контекст постоянства закрывается и присоединенные классы (управляемые) становятся отсоединенными (неуправляемыми). Смотрите это .
Итак, после сохранения Book
b
:
bookService.createBook (b);
Эта транзакция заканчивается, и поэтому книга сохраняется и, кроме того, она больше не управляется. Поэтому, когда я связываю книгу с деталями:
d.setBook (b);
Это то, что нужно сделать, чтобы сохранить сущность, которая разделяет Id, необходимо управлять родительской сущностью (в данном случае b
).
Есть два решения, которые я мог бы найти:
Решение 1:
Прикрепить книгу b к контексту постоянства транзакции создания деталей. См это .
b = getEntityManager.merge(b);
Решение 2: (Тот, который я выбрал)
Выполните вызов бизнес-метода BookService
в бизнес-методе BookDetailsService
, что предполагает перенос внедрения зависимости. Таким образом, одна транзакция выполняется путем сохранения двух сущностей.
//BookDetailsService class
@Inject
BookService bookService;
public void createBookDetails(BookDetails details) {
Book b = new Book();
b.setId(details.getId());
b.setName("Bible");
bookService.createBook(b);
details.setBook(b);//b still managed
super.persist(details);
}
Я думаю, что это решение более понятное и согласованное, потому что BookDetailsService
всегда будут нуждаться в услугах, начиная с BookService
.