这个persistence.xml文件设置了一个名为"coffees"的持久性单元(persistence unit )。它指定了用于数据库连接管理的JDBC数据源的JNDI名称,在WildFly中,针对H2数据库,默认设置为"java:jboss/datasources/ExampleDS"。JNDI名称的配置通常位于WILDFLY_HOME/standalone/configuration目录中的standalone.xml文件中,其中WILDFLY_HOME是WildFly的安装目录。然而,对于这个例子,不需要额外的配置,因为我们使用了默认的JNDI名称。其他运行时环境可能有稍微不同的配置,可以在它们的文档中找到。
其他属性用于配置Jakarta Persistence提供者的日志记录,例如"eclipselink.logging.level.sql"和"eclipselink.logging.parameters”。最后,“hibernate.show_sql"属性用于启用Hibernate Jakarta Persistence提供者2
的SQL查询日志记录。
packageorg.eclipse.jakarta.model;importjakarta.ejb.Stateless;importjakarta.persistence.EntityManager;importjakarta.persistence.PersistenceContext;importorg.eclipse.jakarta.model.entity.Coffee;importjava.lang.invoke.MethodHandles;importjava.util.List;importjava.util.Optional;importjava.util.logging.Logger;@StatelesspublicclassCafeRepository{privatestaticfinalLoggerlogger=Logger.getLogger(MethodHandles.lookup().lookupClass().getName());@PersistenceContextprivateEntityManagerem;publicCoffeecreate(Coffeecoffee){logger.info("Creating coffee "+coffee.getName());em.persist(coffee);returncoffee;}publicList<Coffee>findAll(){logger.info("Getting all coffee");returnem.createQuery("SELECT c FROM Coffee c",Coffee.class).getResultList();}publicOptional<Coffee>findById(Longid){logger.info("Getting coffee by id "+id);returnOptional.ofNullable(em.find(Coffee.class,id));}publicvoiddelete(Longid){logger.info("Deleting coffee by id "+id);varcoffee=findById(id).orElseThrow(()->newIllegalArgumentException("Invalid coffee Id:"+id));em.remove(coffee);}publicCoffeeupdate(Coffeecoffee){logger.info("Updating coffee "+coffee.getName());returnem.merge(coffee);}}
packageorg.eclipse.jakarta.rest;importjakarta.inject.Inject;importjakarta.persistence.PersistenceException;importjakarta.ws.rs.*;importjakarta.ws.rs.core.Response;importorg.eclipse.jakarta.model.CafeRepository;importorg.eclipse.jakarta.model.entity.Coffee;importjava.lang.invoke.MethodHandles;importjava.util.List;importjava.util.logging.Logger;@Path("coffees")publicclassCafeResource{privatefinalLoggerlogger=Logger.getLogger(MethodHandles.lookup().lookupClass().getName());@InjectprivateCafeRepositorycafeRepository;@GET@Path("{id}")@Produces("application/json")publicCoffeefindCoffee(@PathParam("id")Longid){logger.info("Getting coffee by id "+id);returncafeRepository.findById(id).orElseThrow(()->newWebApplicationException(Response.Status.NOT_FOUND));}@GET@Produces("application/json")publicList<Coffee>findAll(){logger.info("Getting all coffee");returncafeRepository.findAll();}@POST@Consumes("application/json")@Produces("application/json")publicCoffeecreate(Coffeecoffee){logger.info("Creating coffee "+coffee.getName());try{returncafeRepository.create(coffee);}catch(PersistenceExceptionex){logger.info("Error creating coffee "+coffee.getName());thrownewWebApplicationException(Response.Status.BAD_REQUEST);}}@DELETE@Path("{id}")publicvoiddelete(@PathParam("id")Longid){logger.info("Deleting coffee by id "+id);try{cafeRepository.delete(id);}catch(IllegalArgumentExceptione){logger.info("Error deleting coffee by id "+id);thrownewWebApplicationException(Response.Status.NOT_FOUND);}}@PUT@Consumes("application/json")@Produces("application/json")publicCoffeeupdate(Coffeecoffee){logger.info("Updating coffee "+coffee.getName());try{returncafeRepository.create(coffee);}catch(PersistenceExceptionex){logger.info("Error updating coffee "+coffee.getName());thrownewWebApplicationException(Response.Status.BAD_REQUEST);}}}
CafeResource类是一个RESTful web服务,用于使用Jakarta RESTful Web Services管理Coffee实体。该类暴露了各种HTTP端点,用于执行CRUD操作,如创建、检索、更新和删除Coffee对象。