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

Dar*_*arz 9 java jpa entitymanager cdi

我想在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我必须做些什么才能实现这一目标?我在我的项目中使用postgres数据库和maven.

我已经读过一些关于Weld的内容(但它看起来只有CDI).我不知道如何添加到Weld possibilty来注入实体管理器.我知道我可以获得实体经理

EntityManagerFactory emf = Persistence.createEntityManagerFactory("mgr");
EntityManager em = emf.createEntityManager();
Run Code Online (Sandbox Code Playgroud)

但它不如注射方便.

如果有任何相关的教程,那将是很棒的.无论如何,谢谢你的帮助!

Pet*_*sik 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>
Run Code Online (Sandbox Code Playgroud)

然后你需要在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();
}
Run Code Online (Sandbox Code Playgroud)

这应该让你开始,然后你可以使用CDI生产者来制作你的EntityManager注射剂

@Produces
@RequestScoped
public EntityManager createEntityManager() {
   return Persistence.createEntityManagerFactory("mgr").createEntityManager();
}

public void closeEM(@Disposes EntityManager manager) {
   manager.close();
}
Run Code Online (Sandbox Code Playgroud)

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