mercredi 3 juin 2015

what's the default JTA transaction boundary

what's the default JTA transaction boundary?

My Environment: Glassfish 4.0, JTA

In my scenario, I've REST layer to provider REST service, a Service layer to handle business, and DAO for data accessing.

@Path("/test")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Singleton
public class TestResource {

    @EJB
    private TestDao dao;

    @GET
    @Path("/{id}/{key}")
    public Test doGet(@PathParam("id") String id, @PathParam("key") String key) {
        Test test = dao.find(id);
        test.setName(key);

        return test;
    }
}

DAO to access database:

Stateless
@LocalBean
public class TestDao extends AbstractDAO<Test> {

    @PersistenceContext(unitName = "ManagerPU")
    private EntityManager entityManager;

    public TestDao() {
        super(Test.class);
    }

    @Override
    protected EntityManager getEntityManager() {
        return entityManager;
    }
}

public abstract class AbstractDAO<T> extends AbstractReadDAO<T> {

    public AbstractDAO(Class<T> entityClass) {
        super(entityClass);
    }

    /**
     * create new entity
     *
     * @param entity
     * @return
     */
    public T create(T entity) {
        EntityManager em = getEntityManager();
        em.persist(entity);
        em.flush();
        em.refresh(entity, LockModeType.PESSIMISTIC_READ);
        return entity;
    }
}

@Setter
@Getter
@Entity
@Table(name = "test")
public class Test extends UUIDEntity {
    private String name;
}

According to the test result:

insert into test(id, name) values("1", "some");

http://localhost:8080/admin/test/1/newName

{
id: "1",
name: "newName"
}

but record in data isn't changed.

So I think the Test object is detached when returned from TestDao in the TestResource layer.

This confused me when the JTA transaction started and ended.

Aucun commentaire:

Enregistrer un commentaire