Java 持久性 API (JPA)

JPA 可用于创建面向对象的关系数据库实体版本,供开发者在其应用程序中使用。

您可以使用 JPA 来提供注释和 XML 扩展,这些注释和扩展可用于描述其数据库中的表及其内容,包括数据类型,键和表之间的关系。 开发者可以使用 API 来执行数据库操作,而不是使用 SQL。

CICS 支持 jpa-2.0, jpa-2.1 和 jpa-2.2。 有关这些版本的不同信息,请参阅 Java 持久性 API (JPA) 功能部件概述

  • Entity objects 是简单的 Java 类,可以是具体类或抽象类。 每个都表示数据库表中的一行,属性和字段用于维护状态。 每个字段都映射到表中的列,并添加有关该特定字段的键信息; 例如,可以指定主键或不能为空的字段。
    @Entity
    @Table(name = "JPA")
    public class Employee implements Serializable
    {
        @Id
        @Column(name = "EMPNO")
        private Long EMPNO;
    
        @Column(name = "NAME", length = 8)
        private String NAME;
    
        private static final long serialVersionUID = 1L;
    
        public Employee()
        {
            super();
        }
    
        public Long getEMPNO()
        {
            return this.EMPNO;
        }
    
        public void setEMPNO(Long EMPNO)
        {
            this.EMPNO = EMPNO;
        }
    
        public String getNAME()
        {
            return this.NAME;
        }
    
        public void setNAME(String NAME)
        {
            this.NAME = NAME;
        }
    }
  • EntityManagerFactory 用于为持久性单元生成 EntityManagerEntityManager 维护应用程序正在使用的 entity objects 的活动集合。 您可以使用 EntityManager 类来初始化这些类,并创建用于管理数据完整性的事务。 接下来,在使用 Entity 事务落实数据之前,使用 Entitygetset 方法与数据进行交互。

    以下示例包含用于插入记录的样本代码:

    @WebServlet("/Create")
    public class Create extends HttpServlet
    {
        private static final long serialVersionUID = 1L;
    
        @PersistenceUnit(unitName = "com.ibm.cics.test.wlp.jpa.annotation.cics.datasource")
        EntityManagerFactory emf;
    
        InitialContext ctx;
    
        /**
        * @throws NamingException
        * @see HttpServlet#HttpServlet()
        */
        public Create() throws NamingException
        {
            super();
            ctx = new InitialContext();
        }
    
        /**
        * @see HttpServlet#doGet(HttpServletRequest request,
        HttpServletResponse response)
        */
        protected void doGet(HttpServletRequest request, HttpServletResponse
            response) throws ServletException, IOException
        {
            // Get the servlet parms
            String id = request.getParameter("id");
            String name = request.getParameter("name");
    
            // Create a new employee object
            Employee newEmp = new Employee();
            newEmp.setEMPNO(Long.valueOf(id));
            newEmp.setNAME(name);
    
            // Get the entity manager factory
            EntityManager em = emf.createEntityManager();
    
            // Get a user transaction
            UserTransaction utx;
    
            try
            {
                // Start a user transaction and join the entity manager to it
                utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
                utx.begin();
                em.joinTransaction();
    
                // Persist the new employee
                em.persist(newEmp);
    
                // End the transaction
                utx.commit();
            }
            catch(Exception e)
            {
                throw new ServletException(e);
            }
            
            response.getOutputStream().println("CREATE operation completed");
        }
    }
  • @PersistenceUnit 表示对 EntityManagerFactory 及其关联持久性单元的依赖关系。 persistence.xml 文件中定义的持久性单元的名称。 要将实体和表连接到数据库,请在捆绑软件中创建 persistence.xml 文件。 persistence.xml 文件描述了这些实体连接到的数据库。 该文件包含重要信息,如供应商名称、实体本身、 URL 和驱动程序。

    以下示例包含样本 persistence.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0"
        xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    
        <persistence-unit name="com.ibm.cics.test.wlp.jpa.annotation.cics.datasource">
            <jta-data-source>jdbc/jpaDataSource</jta-data-source>
            
            <class>com.ibm.cics.test.wlp.jpa.annotation.cics.datasource.entities.Employee</class>
            
            <properties>
                <property name="openjpa.LockTimeout" value="30000" />
                <property name="openjpa.Log" value="none" />
                <property name="openjpa.jdbc.UpdateManager" value="operation-order" />
            </properties>
        </persistence-unit>
    </persistence>