JPA学习--JPA的第一个小例子

来源:互联网 发布:淘宝联盟显示订单失效 编辑:程序博客网 时间:2024/06/07 17:09

前言

JPA的第一个小Demo,涉及到的知识点很多,每一步都很重要,可以说,任何一步出错都无法成功的实现。

运行环境

JPA + maven + postgreSQL

配置文件

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>cn.edu.sdut.softlab.HelloWorldJPA</groupId>    <artifactId>jpa</artifactId>    <packaging>war</packaging>    <version>0.0.1-SNAPSHOT</version>    <name>HelloWorldJPA Maven Webapp</name>    <url>http://maven.apache.org</url>    <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>3.8.1</version>            <scope>test</scope>        </dependency>        <dependency>            <groupId>com.atomikos</groupId>            <artifactId>transactions</artifactId>            <version>3.9.3</version>        </dependency>        <!-- most recent cdi api version is 1.2 by now -->        <dependency>            <groupId>javax.enterprise</groupId>            <artifactId>cdi-api</artifactId>            <version>1.2</version>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-entitymanager</artifactId>            <version>5.0.0.Final</version>        </dependency>        <!-- slf4j simple -->        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-simple</artifactId>            <version>1.7.13</version>        </dependency>        <!-- jsf2 support -->        <dependency>            <groupId>com.sun.faces</groupId>            <artifactId>jsf-api</artifactId>            <version>2.2.12</version>            <scope>provided</scope>        </dependency>        <!-- 添加primefaces依赖 -->        <dependency>            <groupId>org.primefaces</groupId>            <artifactId>primefaces</artifactId>            <version>5.0</version>        </dependency>        <!-- slf4j simple -->        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-simple</artifactId>            <version>1.7.13</version>        </dependency>    </dependencies>    <build>        <finalName>jpa</finalName>        <plugins>            <!-- war package support -->            <plugin>                <artifactId>maven-war-plugin</artifactId>                <version>2.2</version>                <configuration>                    <failOnMissingWebXml>false</failOnMissingWebXml>                </configuration>            </plugin>            <!-- wildfly deploy support see also:https://docs.jboss.org/wildfly/plugins/maven/latest/index.html -->            <plugin>                <groupId>org.wildfly.plugins</groupId>                <artifactId>wildfly-maven-plugin</artifactId>                <version>1.1.0.Alpha5</version>            </plugin>        </plugins>    </build></project>

persistence.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><persistence xmlns="http://java.sun.com/xml/ns/persistence"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">    <!-- name可以自定义 -->    <persistence-unit name="Person" transaction-type="RESOURCE_LOCAL">        <description>            Persistence unit for HelloWorldJPA        </description>        <jta-data-source>java:/jboss/labDS</jta-data-source>        <!-- 持久化类 -->        <class>cn.edu.sdut.softlab.model.Person</class>        <exclude-unlisted-classes>true</exclude-unlisted-classes>        <properties>            <property name="hibernate.transaction.jta.platform"                value="org.hibernate.service.jta.platform.internal.JBossAppS‌​erverJtaPlatform" />            <property name="hibernate.show_sql" value="true" />            <!-- update 表不存在的时候,它会创建数据库表 -->            <property name="hibernate.hbm2ddl.auto" value="update" />            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />        </properties>    </persistence-unit></persistence>

数据源

数据源的配置参见我的另一篇博文:
http://blog.csdn.net/qq_33429968/article/details/53525150

代码设计

Model层–Person类

package cn.edu.sdut.softlab.model;import javax.inject.Named;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@Named("person")@Entitypublic class Person {    @Id    @GeneratedValue(strategy = GenerationType.AUTO) // auto是默认值,可不写    private Long id;    private String name;    private String password;    // 构造器    public Person() {    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

Controller层–PersonController类

package cn.edu.sdut.softlab.controller;import javax.enterprise.context.RequestScoped;import javax.inject.Named;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import javax.transaction.HeuristicMixedException;import javax.transaction.HeuristicRollbackException;import javax.transaction.RollbackException;import javax.transaction.SystemException;import cn.edu.sdut.softlab.model.Person;@Named("controller")@RequestScopedpublic class PersonController {    EntityManagerFactory emf = null;    EntityManager em = null;    private Person newPerson = new Person();    // newPerson的getter和setter方法    public Person getNewPerson() {        return newPerson;    }    public void setNewPerson(Person newPerson) {        this.newPerson = newPerson;    }    // login方法    public void login() throws IllegalStateException, SecurityException, HeuristicMixedException,            HeuristicRollbackException, RollbackException, SystemException {        try {            emf = Persistence.createEntityManagerFactory("Person");            em = emf.createEntityManager();            // 断点测试            System.out.println("打印输出newPerson:   " + newPerson.toString());            System.out.println("打印输出em:  " + em.toString());// 测试结果,EntityManager注入失败            em.getTransaction().begin();// 至关重要的一步:开启事务            em.persist(newPerson);            em.getTransaction().commit();        } catch (Exception e) {            e.printStackTrace();        } finally {            em.close();            emf.close();            System.out.println("存入成功!");        }    }}

前台页面–index.xhtml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"    xmlns:h="http://java.sun.com/jsf/html"    xmlns:f="http://java.sun.com/jsf/core"><h:head></h:head><h:body>    <h1>第一个JPA小例子</h1>    <h:form>输入姓名:<h:inputText value="#{controller.newPerson.name}" />        <br />输入密码:<h:inputText value="#{controller.newPerson.password}" />        <br />        <h:commandButton value="登录" action="#{controller.login}" />    </h:form></h:body></html>

易错点

参考资料

0 0
原创粉丝点击