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文档.
| 归档时间: |
|
| 查看次数: |
10558 次 |
| 最近记录: |