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

标签 java jpa cdi entitymanager

我想在 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();
}

另见 Weld documentation on using CDI in Java SE .

关于java - 在 Java SE 中使用 CDI 和 JPA 的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20935977/

相关文章:

java - hibernate 中的 hbm 文件

java - 递归查找二维矩阵中的元素

java - 新的 EntityManager 有时会从 MySQL 获取陈旧数据

java - JPA GenerationType.AUTO 不考虑具有自动增量的列

java - JEE6 - CDI - 执行时的 DI

java - 如何在监听器内迭代 JPanel 的子组件

mysql - JavaEE 1 :1 Unidirectional Relationship

java - 无状态 session bean 之间的循环依赖 - 好的做法?

java - 无法使用 CDI 将 DAO 注入(inject) EJB

Java日期转换