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

时间:2014-01-05 16:24:52

标签: 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)。我不知道如何添加到Weld 注入实体经理的可能性。我知道我可以通过

获得实体经理
EntityManagerFactory emf = Persistence.createEntityManagerFactory("mgr");
EntityManager em = emf.createEntityManager();

但它不如注射方便。

如果有任何关于此的教程,那就太棒了。无论如何,谢谢你的帮助!

2 个答案:

答案 0 :(得分:16)

首先,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 Producer来制作你的EntityManager注射

@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

答案 1 :(得分:1)

彼得的答案似乎有效,但Maven依赖已过时(见this bug

<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>