jpa

来源:互联网 发布:刷直通车淘宝抓吗 编辑:程序博客网 时间:2024/05/16 12:37
概述    JPA(Java Persistence API)是Sun官方提出的Java持久化规范(JAVA5.0)    它的出现是为了简化现有的持久化开发工作和整合ORM技术,结束现在的Hibernate,TopLink,JDO等ORM框架各自为营的局面    JPA是在现有ORM框架的基础上发展而来的,可以认为是现有ORM框架抽象出来的接口,他的主导者正是hibernate的创始人    JPA只是一个规范,由各个ORM框架厂商负责实现    JPA是现有ORM框架功能的一个子集    JPA的优点    JPA不是一种新的ORM框架,他的出现只是用于规范现有的ORM技术,不能取代现有的hibernate,topLink等ORM框架.    相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化供应商    应用可以在不修改代码的情况下载任何JPA环境下运行,真正做到低耦合,可扩展的程序设计.JPA是一个必然的发展趋势    包含技术    ORM映射元数据        JPA支持XML和JDK5.0注解两种元数据的形式        元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中    Java持久化API        用来操作实体对象,执行CRUD操作        框架在后台替我们完成所有的事情,开发者可以从繁杂的JDBC和SQL代码中解脱出来    查询语言(JPQL)        通过面向对象而非面向数据库的查询语言查询数据,避免程序和SQL语句紧密耦合所需jar包(hibernate)    核心包(/hibernate/hibernate-distribution-3.3.1.GA)        /hibernate3.jar        /lib/bytecode/cglib/hibernate-cglib-repack-2.1_3.jar        /lib/required/*.jar    注解包(/hiberante/hibernate-annotations-3.4.0.GA)        /hibernate-annotations.jar        /lib/ejb3-persistence.jar        /lib/hibernate-commons-annotations.jar    针对JPA的实现包(/hibernate/hibernate-entitymanager-3.4.0.GA)        /hibernate-entitymanager.jar        /lib/test/log4j.jar        /lib/test/slf4j-log4j12.jar        第一个JPA程序HelloWorld    创建项目    导入jar包(别忘了jdbc驱动jar)    创建配置文件        在src下创建META-INF文件夹,新建persistence.xml            <?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_1_0.xsd"                         version="1.0">                <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">                    <properties>                        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>                        <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/数据库名"/>                        <property name="hibernate.connection.username" value="root"/>                        <property name="hibernate.connection.password" value="1234"/>                        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>                        <property name="hibernate.hbm2ddl.auto" value="update"/>                    </properties>                </persistence-unit>            </persistence>    编写javabean        @Entity        public class User {            private Integer id;            private String name;                        @Id @GeneratedValue            public Integer getId() {                return id;            }            public void setId(Integer id) {                this.id = id;            }            public String getName() {                return name;            }            public void setName(String name) {                this.name = name;            }        }    测试代码        //提供数据        User user = new User();        user.setName("张三");                //获得实体管理对象工厂,相当于SessionFactory        EntityManagerFactory factory = Persistence.createEntityManagerFactory("default");        //获得实体管理对象,相当于Session        EntityManager em = factory.createEntityManager();        //开启事务        em.getTransaction().begin();                //持久化对象        em.persist(user);                //提交事务        em.getTransaction().commit();        //释放资源        em.close();        factory.close();配置文件    JPA规范要求在类路径的META-INF目录下放置persistence.xml,文件的名称是固定的    内容示例        <?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_1_0.xsd"                     version="1.0">            <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">                <properties>                    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>                    <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/数据库名"/>                    <property name="hibernate.connection.username" value="root"/>                    <property name="hibernate.connection.password" value="1234"/>                    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>                    <property name="hibernate.hbm2ddl.auto" value="update"/>                </properties>            </persistence-unit>        </persistence>    说明        <persistence-unit>      持久化单元            name                    名称,获取EntityManagerFactory对象时要使用            transaction-type        事务类型,有RESOURCE_LOCAL(本地事务)和JTA(前置事务),不同数据库之间控制事务只能使用前置事务        <property>              指定属性            name                    属性名称            value                   属性值注解(javax.persistence)    javabean类声明上方        @Entity            作用: 标注javabean            位置: javabean类声明上方        @Table            作用: 指定数据库表的规则            位置: javabean类声明上方            参数:                name        指定表名,默认为javabean的类名首字母小写    字段声明上方, 或字段get属性声明上方        @Id            作用: 标注主键        @GeneratedValue            作用: 指定主键的值的规则            参数:                 strategy    指定主键生成策略                    GenerationType.IDENTITY     采用数据库的自动增长                    GenerationType.SEQUINCE     采用数据库的序列                    GenerationType.TABLE        采用一张表维护                    GenerationType.AUTO         根据实际情况使用上述三种方式之一,默认值,可以省略        @Column            作用: 指定数据库列的规则            参数:                name        指定列名,默认为javabean的get属性的属性名                length      指定列长度,值为int                nullable    指定列是否可以为null,值为boolean        @Temporal            作用: 指定数据库的日期类型            参数:                 value   指定数据库的日期类型                    TemporalType.DATE           保存日期                    TemporalType.TIME           保存时间                    TemporalType.TIMESTAMP      保存日期时间        @Enumerated            作用: 指定枚举字段保存到数据库的方式            参数:                 value   指定枚举字段保存到数据库的方式                    EnumType.STRING         保存枚举类型的字面值                    EnumType.ORDINAL        保存枚举类型的索引值        @Lob            作用: 指定大文本数据类型 或 二进制数据类型 (java类型分别为String,和byte[])        @Transient            作用: 指定字段不作为持久化字段,数据库自动创建表时不会存在对应的列        @Basic            作用:           指定基本属性            参数:                fetch       指定属性的加载类型(是否延迟加载)                    FetchType.EAGER     立即加载                    FetchType.LAZY      延迟加载(即访问该属性时,才会去查询数据库)JPA API    EntityManager        获取对象            T find(Class<T>,id)         //相当于hibernate中的get()            T getReference(Class<T>,id) //具有延迟加载作用,相当于hibernate的load()        更新对象            merge(obj)  将游离状态的对象变为托管状态,提交事务时会提交改变        持久化对象            persist(obj)        删除对象            remove(obj)        创建JPQL语句            Query createQuery(jpql)        其它            clean()         将EntityManager对象中的所有托管对象变为游离状态            refresh(obj)    刷新对象的值,直接从数据库中查询,而不是从缓存中获取    Query        获得方式            EntityManager对象的createQuery方法        常用方法            setParameter()      设置参数            getResultList()     获得查询结果List            getSingleResult()   获得唯一结果            executeUpdate()     执行更新语句JPQL语句    语句示例        查询    select o from User o where o.id=?1        删除    delete from User o where o.id=?1        更新    update Person o set o.name=:name where o.id=:id    可以给占位符进行编号        Query query = em.createQuery("select o from User o where o.id=?1");        query.setParameter(1,2);    可以设置占位符名称        Query query = em.createQuery("select o from User o where o.id=:id");        query.setParameter("id",2);JPA实体状态    new     新建    managed 托管:查询到的数据            游离:            删除关联关系映射    在JPA中,多的一端为关系维护端,负责外键记录的更新.    一对多        例:用户(User)和订单(Order)        User中            添加属性: private Set<Order> orderSet;            在get方法上添加: @OneToMany            参数:                cascade     级联操作                    CascadeType.REFRESH     级联刷新(只在使用em.refresh方法时有效)                    CascadeType.PERSIST     级联插入(只在使用em.persist方法时有效)                    CascadeType.MERGE       级联更新(只在使用em.merge方法时有效)                    CascadeType.REMOVE      级联删除(只在使用em.remove方法时有效)                    CascadeType.ALL         上面四项之和                fetch       是否延迟加载关联对象                    FetchType.EAGER         立即加载                    FetchType.LAZY          延迟加载(第一次访问属性时查询)                    注意:如果是一对多,则默认值为LAZY,如果是多对一,则默认值为EAGER                mappedBy    表明此类为关系被维护端,值为多的一端中的一的一端的引用的属性名称        Order中            添加属性: private User user;            在get方法上添加: @ManyToOne            参数:                cascade     级联操作                optional    此属性是否可以为空,值为boolean,默认为true(允许为null)            在get方法上添加: @JoinColumn            参数:                name        外键名称in子句,占位符必须采用参数名的形式,并且参数赋值时必须采用list(数组不管用)
0 0
原创粉丝点击