Tagged: ejb

an idea of general service for the persistence context


@Stateless
public class PersistenceContextService {

    @PersistenceContext
    private EntityManager entityManager;

    public void accept(final Consumer<EntityManager> consumer) {
        consumer.accept(entityManager);
    }

    public void accept(final BiConsumer<EntityManager, U> consumer
                       final U u) {
        consumer.accept(entityManager, u);
    }

    public <R> R apply(final Function<EnityManager, R> function) {
        return function.apply(entityManager);
    }

    public <U, R> R appply(final BiFunction<EntityManager, U, R> function
                           final U u) {
        return function.apply(entityManager, u);
    }
}

And now we can do this.

@Path("/people")
public class PeopleResource {

    @Inject
    private PersistenceContextService service;

    @POST
    @Consumes({MediaType.APPLICATION_JSON})
    public Response create(final Person person) {
        service.accept(em -> em.persist(person));
        return Response.created(URI.create(person.getId()).build();
    }

    @GET
    @Path("/{id: \\d}")
    @Produces({MediaType.APPLICATION_JSON})
    public Person read(final long id) {
        return service.apply(em -> em.find(Person.class, id));
    }
}

various ways to persist entities in jax-rs resources


references

via EJB

@Stateless
public class TestService {

    public Test persist(final Test test) {
        em.persist(test);
        return test;
    }

    @PersistenceContext(unitName = "pu")
    private EntityManager em;
}
@Path("/tests")
public class TestsResource {

    @POST
    @Path("/1")
    public void create1(final Test test) {
        ts.persist(test);
    }

    @EJB
    private TestService ts;
}

via PersistenceUnit

@POST
@Path("/2")
public void create2(final Test test) throws Exception {

    final EntityManager em = emf.createEntityManager();
    try {
        try {
            ut.begin();
            em.joinTransaction();
            em.persist(test);
            ut.commit();
        } catch (final Exception e) {
            ut.rollback();
            throw e;
        }
    } finally {
        em.close();
    }
}

@POST
@Path("/3")
public void create3(final Test test) throws Exception {

    try {
        ut.begin();
        final EntityManager em = emf.createEntityManager();
        try {
            em.persist(test);
        } finally {
            em.close();
        }
        ut.commit();
    } catch (final Exception e) {
        ut.rollback();
        throw e;
    }
}

@PersistenceUnit(unitName = "pu")
private transient EntityManagerFactory emf;

@Resource
private UserTransaction ut;

via PersistenceContext

@POST
@Path("/4")
public void create4(final Test test) throws Exception {

    try {
        ut.begin();
        em.joinTransaction();
        em.persist(test);
        ut.commit();
    } catch (final Exception e) {
        ut.rollback();
        throw e;
    }
}

@PersistenceContext(unitName = "pu")
private transient EntityManager em;

@Resource
private UserTransaction ut;

via PersistenceContext with Transactional Interceptors

@POST
@Path("/5")
@Transactional(rollbackOn = Exception.class)
public void create5(final Test Test) throws Exception {

    em.persist(test);
}

@PersistenceContext(unitName = "pu")
private transient EntityManager em;