当前位置: 首页 > 面试题库 >

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

唐炜
2023-03-14
问题内容

我想在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)。我不知道如何增加焊接实体管理器的可能性。我知道我可以通过获得实体管理器

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

但它不如注射方便。

如果有关于它的任何教程,那就太好了。无论如何,谢谢您的帮助!


问题答案:

首先,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生产者来进行EntityManager注射

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

public void closeEM(@Disposes EntityManager manager) {
   manager.close();
}

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



 类似资料:
  • 问题内容: 我对jQuery相对较新,但是到目前为止,我所看到的都很喜欢。我想要的是让div(或任何元素)跨过页面顶部,就像“位置:固定”在每种浏览器中都起作用一样。 我不要复杂的东西。我不要巨大的CSS骇客。我希望仅使用jQuery(1.2.6版)就足够了,但是如果我需要jQuery-UI-core,那也很好。 我试过$(“#topBar”)。scrollFollow(); <-但是进展缓慢…我

  • 问题内容: 我正在尝试建立一个表,该表链接来自不同表的两个记录。这些链接本身需要与另一个表相关。因此,目前,我的表格如下所示: 但是,项目之间的链接不是定向的(即,项目是链接中列出的第一项还是第二项都没有关系)。理想情况下,我希望item_id字段只出现两次;因为它是我必须要小心,始终检查是否有重复项,以确保如果已经存在14到12,则永远不会创建将12到14链接的记录。 是否有一个优雅的数据库设计

  • 问题内容: cgi.escape似乎是一种可能的选择。它运作良好吗?有什么更好的东西吗? 问题答案: 很好 它逃脱了: 至 至 至 对于所有HTML而言,这就足够了。 编辑:如果您有非ASCII字符,您还想转义,以便包含在使用不同编码的另一个编码文档中,如 Craig 所说,只需使用: 不要忘了解码到第一,使用任何编码它编码的。 但是根据我的经验,如果您从头开始一直都在工作,那么这种编码是没有用的

  • 问题内容: 我在生产中有20GB +的rdb转储。我怀疑有一组特定的按键使它blo肿。我希望有一种方法可以始终从静态转储分析中发现前100个最大对象,或者将其询问给服务器本身,而服务器本身有7M个对象。 像rdbtools这样的转储分析工具在这个(我认为)非常常见的用例中无济于事! 我当时想编写一个脚本,并使用“ redis-cli调试对象”对整个键集进行迭代,但是我感觉必须缺少某些工具。 问题答

  • 问题内容: 反转此ArrayList的最简单方法是什么? 问题答案: 示例(参考):