我想要 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();
}
}
我必须做什么才能实现这一目标?我在我的项目中使用 postgres 数据库和 maven。
我已经在阅读一些有关 Weld 的内容(但它看起来只是像 CDI)。我不知道如何添加到焊接 注入(inject)实体管理器的可能性。我知道我可以通过以下方式获取实体管理器
EntityManagerFactory emf = Persistence.createEntityManagerFactory("mgr");
EntityManager em = emf.createEntityManager();
但是没有注入(inject)那么方便。
如果有相关教程就太好了。无论如何,感谢您的帮助!
最佳答案
首先,EJB 是 Java EE 的一部分,因此您不能在 Java SE 中使用它们。但是,CDI 可以在 Java SE 环境中使用,我的示例将向您展示如何将它与 Weld 一起使用,但还有其他实现 - 请注意,CDI 只是规范,Weld 是该规范的实现之一。
为了使用 Weld,您需要输入 weld-se-x.x.x-Final.jar
在类路径上或在 Maven 中指定其依赖项,例如
<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>
然后你需要在你的 main 方法中启动容器,所以做这样的事情
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();
}
这应该可以帮助您开始,然后您可以使用 CDI Producers 使您的 EntityManager
可注入(inject)
@Produces
@RequestScoped
public EntityManager createEntityManager() {
return Persistence.createEntityManagerFactory("mgr").createEntityManager();
}
public void closeEM(@Disposes EntityManager manager) {
manager.close();
}
关于java - 在 Java SE 中使用 CDI 和 JPA 最简单的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38715117/