principiantes - ¿Cuál es la forma más fácil de tener CDI y JPA en Java SE?
jpa vs hibernate (2)
En primer lugar, los EJB son parte de Java EE, por lo tanto, no puede usarlos en Java SE. Sin embargo, CDI se puede usar en el entorno Java SE, mi ejemplo le mostrará cómo usarlo con Weld, pero también hay otras implementaciones: tenga en cuenta que CDI es solo especificación y Weld es una de las implementaciones de esa especificación.
Para usar Weld, necesitas poner weld-se-xxx-Final.jar
en el classpath o especificar su dependencia en Maven como
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se</artifactId>
<version><!-- See https://mvnrepository.com/artifact/org.jboss.weld.se/weld-se for current version --></version>
</dependency>
Luego debes iniciar el contenedor en tu método principal, así que haz algo como esto
public static void main(String[] args) throws IOException {
Weld weld = new Weld();
WeldContainer container = weld.initialize();
Application application = container.instance().select(Application.class).get();
application.run();
weld.shutdown();
}
Esto debería EntityManager
comenzar, luego puede usar los Productores CDI para hacer que su EntityManager
inyectable.
@Produces
@RequestScoped
public EntityManager createEntityManager() {
return Persistence.createEntityManagerFactory("mgr").createEntityManager();
}
public void closeEM(@Disposes EntityManager manager) {
manager.close();
}
Consulte también la documentación de Weld sobre el uso de CDI en Java SE .
Me gustaría tener en Java SE
@Stateless
public class CarDAO {
@Inject
private EntityManager em;
public Car findById(Long id) {
return em.find(Car.class, id);
}
}
@Singleton
public class Application {
@Inject
private CarDAO carDAO;
public void run() {
Car car = carDAO.findById(44);
System.out.println(car);
}
}
public class EntryPoint {
public static void main(String[] args) {
Application application = // missing code
application.run();
}
}
¿Qué tengo que hacer para lograr eso? Estoy usando la base de datos postgres, y maven en mi proyecto.
Ya estaba leyendo algo sobre Weld (pero parece solo CDI). No sé cómo agregar a Weld la posibilidad de inyectar Entity Manager. Sé que puedo obtener Entity Manager con
EntityManagerFactory emf = Persistence.createEntityManagerFactory("mgr");
EntityManager em = emf.createEntityManager();
pero no es tan conveniente como inyectar.
Sería genial si hay algún tutorial sobre eso. De todos modos, gracias por cualquier ayuda!
La respuesta de Peter parece funcionar, pero las dependencias de Maven están desactualizadas (ver este error )
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>2.3.1.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core</artifactId>
<version>2.3.1.Final</version>
</dependency>
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jandex</artifactId>
<version>1.2.2.Final</version>
</dependency>