JPA与hibernate入门

一、JPA概述


  1. JPA是java持久化规范。java persistence API
    a.先有的hibernate,才有的JPA。
    b.是SUN公司推出的一套基于ORM的规范。hibernate框架中提供了JPA的实现。
    c.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
  2. hibernate直接操作实体类对象,来操作数据库信息。他的追随者(其他的ORM框架)就效仿,但是还要显得不一样,所以他们连同命名都不一样,于是其他的框架就出来了规范,但是hibernate毫不示弱,我先出来的就应该先出来规范,于是他要求sun 公司也提出规范,于是
  3. JPA是目前比较流行的一种ORM技术之一,所以他拥有ORM技术的各种特点,还有自己之前的一些优势。
  4. a、JPA是一套ORM规范,hibernate实现了JPA规范
    b、hibernate中有自己的独立ORM操作数据库方式,也有JPA规范实现的操作数据库方式。
    c、在数据库增删改查操作中,我们hibernate和JPA的操作都要会。
    二、小练习的知识点+出现的问题
    1.注解:也给编译器看的,实现功能,解释说明
    2.xml文件导入schema约束。代码:@demo1
    3.使用的jpa规范的注解,所以导包,都是javax.persistence包下面的。
    4.META-INF文件夹放在src下面。

em.merge(c);
//更新–》加上这句:创建第二个对象,进行修改的话,第一次的session被关闭,
//第二次开启session进行查询的时候,新建缓存区+新建对象(值被改变,但是对象的标识符没有被改变)。
//一个是浏览器改过的对象,一个是刚查的对象,那你想给前者赋值,需要每个字段都赋值,麻烦。关闭session,持久态对象,一直在一级缓存中,托管态对象需要挪到一级缓存中。
我们应该给持久态对象赋值,不然,就会出现这样的问题。
//注解配置和xml配置外键信息。选择一个就可以。
//一对多关系映射:一个客户可以有多个联系人
    @OneToMany(targetEntity=LinkMan.class,mappedBy="customer",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    private Set<LinkMan> linkmans = new HashSet<LinkMan>(0);
    /*
targetEntity需要映射的类。
mappedBy:“映射来自”,把关系维护交这个对象,这是对方表的关联属性。=get,set方法后面的名称。多的一方去维护。
如果一的一方不放弃,关联关系的话,会出现异常。rollbackexception,异常的原因:持久态对象关联临时态对象,在刷新之前,先保存临时态对象。
cascade=CascadeType.ALL:级联保存更新,更新也可以是merge,JPA在保存的时候,会在外键上附上值,hibernate需要多一条更新语句。
    */
    /*********************************************/
    //一对多关系映射,多的一方。
    //从表实体包含主表实体的对象引用
    @ManyToOne(targetEntity=Customer.class,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
    @JoinColumn(name="lkm_cust_id",referencedColumnName="cust_id")
    private Customer customer;

//@demo1
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"  
    version="2.0">  
    <!-- 配置持久化单元,可以配置多个,但是名称不能重复
        name:用于指定持久化单元名称
        transaction-type:指定事务的类型。
                JTA:Java Transaction API
                RESOURCE_LOCAL:指的是本地代码事务。(我们用这个)    
     -->
    <persistence-unit name="myJPAUnit" transaction-type="RESOURCE_LOCAL">
        <!-- JPA规范的提供商  可以不写。-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- 指定由Jpa注解的实体类位置     可以不写。-->
        <class>com.itheima.domain.Customer</class>
        <!-- 连接库相关的一些配置,都是用hibernate的,所以只需要把之前hibernate主配置文件中的部分内容拷贝过来即可 -->
        <properties>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/day58_ee287_jpa"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="1234"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/><!-- 数据库的方言 -->
            <!-- 第二部分:hibernate的可选配置 -->
            <!-- 是否显示hibernate生成的SQL语句 -->
            <property name="hibernate.show_sql" value="true"/>
            <!-- 是否使用格式化输出sql语句到控制台 -->
            <property name="hibernate.format_sql" value="false"/>
            <!-- 配置hibernate采用何种方式生成DDL语句 -->
            <property name="hibernate.hbm2ddl.auto" value="update"/><!-- update表示检测实体类的映射配置和数据库的表结构是否一致,如果不一致,更新表结构 -->
            <!-- 设置hibernate的连接池提供商 -->
            <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
        </properties>
    </persistence-unit>
</persistence>

猜你喜欢

转载自blog.csdn.net/Estelle_ya/article/details/82078474