= Meecrowave JPA :jbake-date: 2016-10-24 :jbake-type: page :jbake-status: published :jbake-meecrowavepdf: :jbake-meecrowavetitleicon: icon icon_puzzle_alt :jbake-meecrowavecolor: body-green :icons: font The overall idea behind this module is to propose a CDI integration of JPA allowing to programmatically control its persistence units. Concretely you will create a persistence unit from a `PersistenceUnitBuilder` allowing you to fully configure your unit from CDI context including the datasource: [source,java] ---- @ApplicationScoped public class JpaConfig { @Produces public PersistenceUnitInfoBuilder unit(final DataSource ds) { return new PersistenceUnitInfoBuilder() .setUnitName("test") .setDataSource(ds) .setExcludeUnlistedClasses(true) .addManagedClazz(User.class) .addProperty("openjpa.RuntimeUnenhancedClasses", "supported") .addProperty("openjpa.jdbc.SynchronizeMappings", "buildSchema"); } } ---- TIP: if your application uses a single persistence unit this is optional and a default one will be created if a single DataSource bean is available as Bean. The datasource can be produces as you wish using your own configuration mecanism: [source,java] ---- @ApplicationScoped public class JpaConfig { @Produces // dbcp2 datasource for instance @ApplicationScoped public DataSource dataSource() { final BasicDataSource source = new BasicDataSource(); source.setDriver(new Driver()); source.setUrl("jdbc:h2:mem:jpaextensiontest"); return source; } } ---- NOTE: it is recommanded to ensure the `DataSource` is normal-scoped to not get surprises in term of behavior. Finally you can inject your entity manager using `@Unit`. Ensure to decorate with `@Jpa` a class/method before using the entity manager to activate the jpa CDI context: [source,java] ---- @ApplicationScoped @Jpa(transactional = false) public class JPADao { @Inject @Unit(name = "test") private EntityManager em; @Jpa // with a resource local transaction public User save(final User user) { em.persist(user); return user; } // inherit form class, no tx public User find(final long id) { return em.find(User.class, id); } } ---- IMPORTANT: this integration is 100% based on `RESOURCE_LOCAL` units for now. Not that if a bean get injected an `EntityManager` it gets automatically `@Jpa(transactional=true)` so previous bean is equivalent to: [source,java] ---- @ApplicationScoped public class JPADao { @Inject @Unit(name = "test") private EntityManager em; public User save(final User user) { em.persist(user); return user; } @Jpa(transactional = false) public User find(final long id) { return em.find(User.class, id); } } ---- == Integration with Bean Validation The extension will try to find a `ValidatorFactory` in CDI context and will provide ir to the JPA provider if the `ValidationMode` is not `NONE` and a `Bean` exists.