当前位置: 首页 > news >正文

游戏模型外包网站个人主页网站开发背景

游戏模型外包网站,个人主页网站开发背景,机械网站推广怎么做,网站建设谈单思路JPA规范定义了几种类型的EntityManagers / Persistence Context。 我们可以有#xff1a; 扩展的和事务范围的EntityManager#xff0c; 容器管理或应用程序管理的EntityManager。 JTA或本地资源EntityManager#xff0c; 除了上述区别外#xff0c;我们还可以在其中存… JPA规范定义了几种类型的EntityManagers / Persistence Context。 我们可以有 扩展的和事务范围的EntityManager 容器管理或应用程序管理的EntityManager。 JTA或本地资源EntityManager 除了上述区别外我们还可以在其中存在EntityManager / Persistence Context的两个主要上下文– Java EE和Java SE 。 并非每个选项都适用于Java EE并且并非每个选项都适用于Java SE。 在本文的其余部分 我将介绍Java EE环境 。 好的因此在继续本文之前的主题之前这是使用EntityManagerFactory手动创建的Java EE中EntityManager的行为-我们仅简要介绍上述EM类型。 扩展与事务范围 此功能告诉我们EntityManager的操作是否可能跨越多个事务。 默认情况下使用事务性持久性上下文这意味着当提交当前事务时将清除所有更改并分离所有受管实体。 扩展范围仅适用于有状态EJB。 这非常合理因为SFSB可以保存状态因此不必终止一种业务方法就意味着结束事务。 使用SLSB时情况就不同了–我们有业务方法必须在业务方法完成时结束因为在下一次调用中我们不知道我们将以哪个EJB实例结尾。 SLSB仅允许事务范围的EntityManager。 您可以控制在EntityManager注入期间EntityManager是扩展的还是事务的 PersistenceContext(typejavax.persistence.PersistenceContextType.EXTENDED) EntityManager em; 默认情况下为javax.persistence.PersistenceContextType.TRANSACTION 。 附带说明–使用扩展的EntityManager可能允许您创建一些有趣的解决方案 看看具有事务性保存方法技巧的 Adam Bien的无事务bean 。 他使用这种方法使事务开始和结束时自动清除所有更改并且他实际上通过调用特殊的人工方法来做到这一点。仅在容器管理的EntityManagers的情况下才允许扩展和事务范围的PersistenceContext。 容器管理与应用程序管理 在绝大多数Java EE应用程序中您只是使用PersistenceContext注入EntityManager如下所示 PersistenceContext EntityManager em; 实际上这意味着您要让容器为您的EntityManager注入 容器是在后台从EntityManagerFactory创建的。这意味着EntityManager是由容器管理的。 另外您可以从EntityManagerFactory自己创建一个EntityManager。 您可以通过注入获得它 PersistenceUnit EntityManagerFactory emf; 然后要获取EntityManager您需要调用emf.createEntityManager() 。 就是这里–您正在使用由应用程序管理的EntityManager 。 应用程序您负责创建和删除EntityManager。 每个应用程序管理的持久性上下文都有扩展的范围。 如果要控制已创建的EM则可以使用-例如要为基础JPA实现程序设置一些属性或者只是在业务方法将其投入使用之前插入自己。 但是您将需要跨事务涉及的多个bean移动创建的EntityManager –容器不会为您这样做并且每次调用emf.createEntityManager()您都在创建一个与新PersistenceContext连接的EntityManager。 。 您可以使用CDI进行EntityManager的共享但这是最后一节之一的主题。 JTA与本地资源 此属性定义您是要JTA管理EntityManager的事务还是要使用其直接API开始和提交。 如果您使用的是容器管理的EntityManager则自动意味着您必须使用JTA EntityManager 。 如果您使用的是应用程序管理的EntityManager则可以使用JTA或本地资源。 在现实生活中这意味着如果您使用的是JTA EntityManager则您只需照顾更高级别的事务管理 声明性地 使用注释或XML JTA交易属性或 以编程方式 使用javax.transaction.UserTransaction 。 如果您使用的是本地资源EntityManager则需要更深入一点并使用EntityManager.getTransaction()返回javax.persistence.EntityTransaction并调用commit(-) begin(-) rollback()等。使用transaction-type属性在persistence.xml定义此功能 ?xml version1.0 encodingUTF-8? persistence ...persistence-unit transaction-typeRESOURCE_LOCAL ... /persistence 另一个可能的值当未定义transaction-type时为默认值是JTA 。 Java EE中由应用程序管理的JTA EntityManager 尽管这个字幕听起来很复杂但了解EntityManager和PersistenceContexts的所有先前类型后您应该确切了解if指的是什么。 “应用程序托管”意味着我们将注入PersistenceUnit EntityManagerFactory而不是EntityManager 之所以称为 “ Java EE”是因为这些示例在github上发布仅在Java EE Application Server中使用 “ JTA”因为我们将使用JTA事务级别因此不会使用javax.persistence.EntityTransaction 。 现在您需要意识到的第一件事是如何使用JTA事务。 JTA事务管理有两种类型-容器CMT和Bean管理BMT。 容器管理的JTA事务 CMT 意味着您使用javax.ejb.TransactionAttribute定义tx是否应处于活动状态以及事务边界在何处。 这是默认的JTA管理类型。 或者您可以选择自己划定JTA事务的边界。 这称为Bean管理的JTA事务 BMT 。应用程序您负责启动回滚或提交事务。 您如何控制JTA交易 您可以使用javax.transaction.UserTransaction做到这一点。 您如何获得一个 好吧至少有3种方法可以做到这一点 它绑定到组件私有名称空间 java:comp/UserTransaction 中的JNDI因此您可以使用InitialContext或SessionContext对其进行查找 您可以使用SessionContext进行访问– SessionContext#getUserTransaction() 因为它绑定在众所周知的JNDI名称中所以您可以让容器使用以下方式注入它 Resource UserTransaction utx; 。 如果您具有UserTransaction 则可以开始划分事务中要执行的内容。 注意您仍在控制JTA事务 -您甚至都没有接触EntityManager的资源本地事务。 EntityManager何时在JTA事务中 如果没有前面的介绍您可能会认为由应用程序管理的EntityManager意味着您将自己承担一切–创建共享EntityManager开始tx提交关闭。 但是了解了以上所有差异后您知道可以在应用程序管理的EntityManager中使用JTA事务 。 但是问题是–如何使它知道活动的JTA事务 如果我们有一个由容器管理的EntityManager我们知道容器将全部管理该容器但是如果我们独自一人–我们该怎么做 实际上 这取决于我们在哪里创建EntityManager 。 在下面找到一些示例完整的代码可以在我的github帐户上找到 情况1我们在没有活动交易的情况下调用以下代码因此对于CMT我们具有TransactionAttribute.NEVER或TransactionAttribute.NOT_SUPPORTED 对于BMT我们不调用UserTransaction.begin() EntityManager em emf.createEntityManager(); em.persist(new Customer(firstName, lastName)); 结果 EntityManager操作在持久化时不会引发任何异常但是所有更改都不会提交 。 没有活动的事务因此不会进行任何更改。 情况2我们使用BMT调用以下代码 utx.begin();EntityManager em emf.createEntityManager();em.persist(new Customer(firstName, lastName));utx.commit(); 结果在JTA提交期间新数据已正确保留在最后一行。 情况3我们使用BMT调用以下代码 EntityManager em emf.createEntityManager(); utx.begin();em.persist(new Customer(firstName, lastName));utx.commit(); 结果 EntityManager在事务之外因为它是在启动JTA事务之前创建的。 尽管已提交JTA事务但更改不会持久保存。 没有异常被抛出。 在第二个示例的情况下您可能会问自己–是否可以首先创建EntityManager然后开始事务最后以某种方式使EntityManager知道周围的TX 如果事实是这样则可以执行此操作而这正是EntityManager#joinTransaction()方法的用途。 以下两种情况将向您展示如何使用它 情况4我们使用BMT调用以下代码 EntityManager em emf.createEntityManager(); utx.begin(); em.joinTransaction();em.persist(new Customer(firstName, lastName));utx.commit(); 结果在这里我们明确地告诉EntityManager加入活动的JTA事务。 结果 EntityManager将在JTA commit期间刷新其所有更改 。 情况5我们使用BMT调用以下代码 EntityManager em emf.createEntityManager(); utx.begin();em.joinTransaction();em.persist(new Customer(firstName, lastName));utx.commit();utx.begin();em.joinTransaction();em.persist(new Customer(firstName, lastName));utx.commit(); 结果 两个EntityManager操作都正确存在。 在这里我们证明了应用程序管理的持久性上下文可以跨越多个JTA事务 请注意我们没有创建另一个EntityManager而只是重用了先前事务中使用的那个。在这里您可以看到JPA规范JPA规范 2.0最终版本告诉您有关应用程序管理的持久性上下文的信息 7.7应用程序管理的持久性上下文 使用JTA应用程序管理的实体管理器时如果实体管理器在当前JTA事务的范围之外创建则应用程序有责任通过调用EntityManager.joinTransaction将实体管理器与事务关联如果需要。 。 如果实体管理器是在JTA事务范围之外创建的则除非调用EntityManager.joinTransaction否则它不与事务关联。 使用CDI共享EntityManager 如前所述如果要在组成一个事务的组件之间共享EntityManager则应手动传递它毕竟它是“应用程序管理的”。CDI可能是此处的解决方案。 您可以生成请求范围的EntityManager并将其注入所需的任何组件中。 看起来可能像这样在现实生活中您还需要注意处理EM public class Resources {PersistenceUnitEntityManagerFactory emf;Produces RequestScopedpublic EntityManager createEntityManager() {return emf.createEntityManager();} } 现在在每个bean中我们都可以拥有 Stateless public class MyBean {InjectEntityManager em; } 在构成事务的不同组件之间共享应用程序管理的持久性上下文似乎是一种非常干净的方法。 但是我担心的是知道由应用程序管理的EntityManager事务性行为取决于创建它的位置 因此这种方法有时可能会给您带来讨厌的结果。 以以下代码为例在我的Github项目中也可以找到该类 此处正是该类 Stateless TransactionAttribute(TransactionAttributeType.NEVER) public class BeanABoundary {Injectprivate EntityManager em;EJBBeanB beanB;public void invoke() {em.getProperties();beanB.invoke(); } 请注意BeanA是非事务性资源。 还要注意我们在EntityManager上注入并调用了一些操作 这使得注入实际上得以执行。现在如果BeanB是事务性的并且也注入并使用EntityManager –我们将以不会进行抛出的非事务性EntityManager结尾任何异常并且不会将任何更改保存到数据库 。 在旧的PersistenceContext的情况下我们将处于事务中因为EntityManager将由容器管理并且容器将知道当前处于活动状态的事务。 容器负责在事务边界之间共享EntityManager。 在显示CDI生产者方法的情况下CDI不知道运行事务而只是共享EntityManager。 当然可以使用CDI并创建一个Produces PersistenceContext EntityManager em 然后使用Inject EntityManager 。 这将与PersistenceContext EntityManager完全一样但是允许我们在生成EntityManager的单个位置定义例如持久性单元的名称。 但是如果我们要拥有一个应用程序管理的EntityManager则这不是一个选择。 参考 实体管理器的类型由我们的JCG合作伙伴 Piotr Nowicki在Piotr Nowicki主页博客上进行的应用程序管理的EntityManager 。 翻译自: https://www.javacodegeeks.com/2013/03/types-of-entity-managers-application-managed-entitymanager.html
http://www.huolong8.cn/news/200553/

相关文章:

  • ae成品免费下载网站电商推广文案
  • 建设银行东莞招聘网站嘉兴网站开发学校
  • 卖灯杆的做网站好黑群晖 frp wordpress 访问
  • 摄影网站有哪些?网站公告栏设计
  • 便宜建站腾讯云 wordpress建站
  • 制作网站要花多少钱如何建设公司企业使命
  • 做网站 传视频 用什么笔记本好中国电子商务网站
  • 帝国cms做下载网站网站建设项目背景
  • 在58做网站推广有效果吗html代码入门
  • 可以做营销任务的网站深圳住房建设部网站
  • 泉州建站服务中国建设银行官方网站
  • 做网站公司三年财务预算表wordpress改变主题颜色
  • 网站做cpawordpress 邮件通知 密码
  • 网站首页phpcms怎么添加网站打不开了怎么办
  • 广东做网站策划wordpress 重装教程视频教程
  • 网站选项卡代码网站前期基础建设 怎么写
  • 网站内容编辑器今天新闻最新消息
  • 流量网站建设教程成都建站费用
  • 提供微信网站建设做外贸的有哪些网站
  • 找人做网站需要注意问题全网营销包括什么
  • 株洲网站建设的企业产品价格的网站建设
  • 有哪些网站可以免费看电影湖州网站设计建设
  • 做微商哪个网站好淘宝客网站用什么软件做
  • 美篇在哪个网站做的深圳网络推广培训机构
  • app营销策划方案网站优化如何做
  • 计算机网络技术 网站建设方向crm与scrm
  • 做网站签了合同后不想做了免费模版网站
  • 重庆做网站需要多少钱张家港哪家做企业网站
  • 上海云建站模板企业网站建设 推广
  • 专业做酒类营销的网站wordpress前台用户中心