package org.talend.esb.examples.ebook.persistence; import java.util.ArrayList; import java.util.List; import javax.inject.Singleton; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.criteria.CriteriaQuery; import javax.transaction.Transactional; import org.ops4j.pax.cdi.api.OsgiServiceProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.talend.esb.examples.ebook.model.Book; import org.talend.esb.examples.ebook.model.BookRepository; import org.talend.esb.examples.ebook.model.Format; import org.talend.esb.examples.ebook.model.Subject; @OsgiServiceProvider(classes = {BookRepository.class}) @Singleton @Transactional public class BookRepositoryImpl implements BookRepository { Logger LOG = LoggerFactory.getLogger(BookRepositoryImpl.class); @PersistenceContext(unitName="ebook") EntityManager em; @Override public void add(Book book) { if (getBook(book.getId()) != null) { LOG.info("Ignoring book {} as it already exists.", book.getId()); return; } for (Format fomat : book.getFormats()) { em.persist(fomat); } persistSubjects(book); em.persist(book); if ("error1".equals(book.getTitle())) { throw new RuntimeException("Test for error handling. Should cause tx rollback"); } } private void persistSubjects(Book book) { List<Subject> outSubjects = new ArrayList<Subject>(); for (Subject subject : book.getSubjects()) { Subject outSubject = em.find(Subject.class, subject.getSubject()); if (outSubject == null) { em.persist(subject); outSubject = subject; } outSubjects.add(outSubject); book.setSubjects(outSubjects); try { em.persist(subject); } catch (Exception e) { em.merge(subject); } } } @Override @Transactional(Transactional.TxType.SUPPORTS) public Book getBook(String id) { return em.find(Book.class, id); } @Override public List<Book> getBooks() { CriteriaQuery<Book> query = em.getCriteriaBuilder().createQuery(Book.class); return em.createQuery(query.select(query.from(Book.class))).getResultList(); } @Override public void update(Book book) { em.merge(book); } @Override public void delete(String id) { Book book = getBook(id); if (book != null) { em.remove(book); } } public void setEm(EntityManager em) { this.em = em; } }