19. JPA
public interface Query<T> {
CriteriaQuery<T> execute(
CriteriaBuilder b, CriteriaQuery<T> q, Root<T> r);
}
Abstract
Dao
20. JPA
public abstract class BaseDao<T> {
protected T getSingleResult(Query<T> query) {
CriteriaBuilder b =
this.entityManager.getCriteriaBuilder();
!
CriteriaQuery<T> q =
b.createQuery(this.getEntityClass());
!
Root<T> r = q.from(this.getEntityClass());
!
Abstract
Dao
return this.entityManager.createQuery(
query.execute(b, q, r)).getSingleResult();
}
!
protected abstract Class<T> getEntityClass();
}
21. JPA
public class UserDao extends BaseDao<User> {
!
!
}
public User findByName(final String name) {
return this.getSingleResult(new Query<User>() {
@Override
public CriteriaQuery<User> execute(
CriteriaBuilder b,
CriteriaQuery<User> q,
Root<User> r) {
Concrete
Dao
return q.select(r).
where(b.equal(r.get(User_.name), name));
}
});
}
22. public class UserDao extends BaseDao<User> {
!
}
public User findByName(String name) {
return this.getSingleResult((b, q, r) ->
q.select(r).where(b.equal(r.get(User_.name), name));
}
Concrete
Dao
23. CDI
Bean Validation
@Transactional
public class UserService {
@Inject
private UserDao userDao;
!
public User create(@NotNull String name) {
User user = new User(name);
this.userDao.persist(user);
!
return user;
}
!
public User show(@NotNull String name) {
return this.userDao.findByName(name);
}
}
Service
24. JAX-RS
CDI
@Path("user")
public class UserResource {
@Inject
private UserService userService;
!
@Path("{name}") // PUT /user/{name}
@PUT
public User create(@PathParam("name") String name) {
return this.userService.create(name);
}
!
}
@Path(“{name}") // GET /user/{name}
@GET
public User show(@PathParam("name") String name) {
return this.userService.show(name);
}
JAX-RS