JPA学习开始创建一个项目

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ilikejj0/article/details/82055024

1、创建一个项目,

可以使用eclipse直接创建JPA project,也可以创建java项目,然后手动添加persistence.xml文件,(首先在src下创建META-INF文件夹,然后创建persistence.xml)。
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="jpa" transaction-type="RESOURCE_LOCAL">

        <!-- 
           配置用什么ORM框架
        1. 实际上配置的是 javax.persistence.spi.PersistenceProvider 接口的实现类
        2. 如果JPA项目中只有一个JPA的实现产品,则可以不配置该节点
         -->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <!-- 添加持久化类 -->
        <class>com.atguigu.jpa.bean.User</class>
        <properties>
            <!-- 配置数据源信息 -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///hibernate1"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="root"/>

            <!-- 配置JPA实现产品的属性,即hibernate的属性 -->
            <property name="hibernate.format_sql" value="true"/><!-- 是否格式化sql语句 -->
            <property name="hibernate.show_sql" value="true"/> <!-- 是否在控制台打印sql语句 -->
            <!-- 生成数据表的策略,有就更新,没有就创建 -->
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>

注意:在最开始因为导入的jar包版本的问题,报了错误,显示jar包版本不支持2.0,所以删除了一部分jar包,又重新导入了jar包,但是后来又加入与时间相关的属性,再进行重新创建表时,没有报错,但是也创建出时间属性相关的列,解决办法如下:

解决第一张图片
解决第二张图片
不报错的jar包版本
jar包版本

2、创建持久化类

package com.atguigu.jpa.bean;

import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

@Table(name="tb_user")   //为数据库表命名,如果不加,自动为类名
@Entity   //将类标记为实体类,对应数据库的表
public class User {

    private Integer userId;
    private String userName;
    private String password;
    private String email;
    private Date createTime;
    private Date birth;

    //映射数据表字段的名字,还可以指定长度等等
    //如果不写,则是默认长度
    @Column(name="user_id",length=50)   
    //生成主键的策略
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Id   //映射主键,加到get方法上
    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    @Column(name="user_name")
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    @Basic  //默认get方法上是加了该注解的,把属性映射到表字段
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    //创建时间应该精确到秒,不加默认是精确到秒
    //下面这个属性值代表精确到秒,时间戳
    @Temporal(TemporalType.TIMESTAMP)
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    //生日应该精确到时间,即年月日
    @Temporal(TemporalType.DATE)
    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    //这是一个工具的方法,不需要映射到数据库表中,
    //这时使用@Transient,表示忽略该属性,不进行映射
    @Transient
    public String getInfo(){
        return "userName="+userName+"email"+email;
    }

}

3、将持久化类配置到persistence.xml文件中

<!-- 添加持久化类 -->
<class>com.atguigu.jpa.bean.User</class>

4、测试使用

//1.创建EntityManagerFactory
//2.创建EntityManager
//3.开启事务
//4.进行持久化操作
//5.提交事务
//6.关闭EntityManager
//7.关闭EntityManagerFactory

//下面persistenceUnitName的值为persistence.xml文件中的下面标签内name的值
        /*<persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">*/
        String persistenceUnitName="jpa";
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        EntityTransaction tx= entityManager.getTransaction();
        tx.begin();

        User user = new User();
        user.setUserName("源稚生");
        user.setPassword("123456");
        user.setEmail("[email protected]");
        //进行保存
        entityManager.persist(user);

        tx.commit();
        entityManager.close();
        entityManagerFactory.close();

详细知识点:主键生成策略(用table生成主键)

将当前主键的值单独保存到数据库的一个表中,主键的值每次都从表中查询来获得,这种方法生成的主键策略适用于每一个数据库,不用担心不兼容问题。

首先在数据库建立一个表
表
在持久化类上进行如下设置

    //生成主键的策略
    //name指定生成器,table指定使用哪个表
    //pkColumnName和pkColumnValue确定一行
    //valueColumnName确定一列,然后一行一列确定一点
    //allocationSize主键每次增加100
    @TableGenerator(name="ID_GENERATOR",
            table="jpa_id_generator",
            pkColumnName="PK_NAME",
            pkColumnValue="USER_ID",
            valueColumnName="PK_VALUE",
            allocationSize=100      
            )  
    @GeneratedValue(strategy=GenerationType.TABLE,generator="ID_GENERATOR") //generator是生成器
    @Id   //映射主键,加到get方法上
    public Integer getUserId() {
        return userId;
    }

OK

猜你喜欢

转载自blog.csdn.net/ilikejj0/article/details/82055024