在Java SE中使用CDI和JPA的最简单方法是什么?

我想在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)。 我不知道如何添加到Weld possibilty来注入Entity Manager。 我知道我可以获得实体经理

 EntityManagerFactory emf = Persistence.createEntityManagerFactory("mgr"); EntityManager em = emf.createEntityManager(); 

但它不如注射方便。

如果有任何关于这方面的教程,那将是很棒的。 无论如何,谢谢你的帮助!

首先,EJB是Java EE的一部分,因此您无法在Java SE中使用它们。 但是,CDI可以在Java SE环境中使用,我的示例将向您展示如何将它与Weld一起使用,但也有其他实现 – 请注意,CDI只是规范,而Weld是该规范的实现之一。

要使用Weld,您需要将weld-se-xxx-Final.jar放在类路径上,或者在Maven中指定它的依赖关系

  org.jboss.weld.se weld-se   

然后你需要在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生产者使你的EntityManager可注射

 @Produces @RequestScoped public EntityManager createEntityManager() { return Persistence.createEntityManagerFactory("mgr").createEntityManager(); } public void closeEM(@Disposes EntityManager manager) { manager.close(); } 

另请参阅有关在Java SE中使用CDI的Weld文档 。

Peter的答案似乎有效,但Maven依赖已经过时(请参阅此bug )

  org.jboss.weld.se weld-se-core 2.3.1.Final   org.jboss.weld weld-core 2.3.1.Final   org.jboss jandex 1.2.2.Final