hibernate實現JPA規范配置


JAP(java Persistence API)sun公司推出一套基於ORM的規范
hibernate實現了這套規范
hibernate有自己獨立的ORM操作數據庫方式,也有JPA規范實現的操作數據庫方式
jar包是:hibernate-entitymanager-5.0.7.Final.jar
在src下創建META-INF文件夾下創建一個名稱為persistence.xml的文件




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_2_0.xsd"
    version="2.0">
    <!--在根標簽下至少要存在一個持久化單元 (有一個數據庫的連接信息)-->
    <persistence-unit name="aaa">
            <properties>
                <!-- 配置多條數據庫的信息 -->
                    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
                    <property name="hibernate.connection.url" value="jdbc:mysql:///jpa"></property>
                    <property name="hibernate.connection.username" value="root"></property>
                    <property name="hibernate.connection.password" value="1234"></property>
                    <!-- 方言 -->
                    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"></property>
                    
                    <property name="hibernate.show_sql" value="true"></property>
                    <property name="hibernate.format_sql" value="true"></property>
                    <property name="hibernate.hbm2ddl.auto" value="update"></property>
                    
                    <!-- 配置c3p0 -->
                    <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"></property>
            </properties>
    </persistence-unit>
</persistence>
約束的聲明可在hibernate-entitymanager-5.0.7.Final.jar--org.hibernate.jpa--persistence_2_0.xsd(中第24行到26行)




(一對多的關系配置案例:)
Customer:
        // ps: 所有jpa的注解都在 javax.persistence包下
        @Entity
        @Table(name="cst_customer")
        public  class Customer
        {
             @Id
             @Column(name="cust_id")
             @GeneratedValue(strategy=GenerationType.IDENTITY)
             private Long cust_id; // '客戶編號(主鍵)',   0  null
            
             @Column(name="cust_name")
             private String cust_name; // '客戶名稱(公司名稱)',
            
             @Column(name="cust_source")
             private String cust_source; // '客戶信息來源',
            
             @Column(name="cust_industry")
             private String cust_industry; // '客戶所屬行業',
            
             @Column(name="cust_level")
             private String cust_level; //'客戶級別',
            
             @Column(name="cust_address")
             private String cust_address; // '客戶聯系地址',
            
             @Column(name="cust_phone")
             private String cust_phone; // '客戶聯系電話',
            
             // 有聯系人的集合
            /* targetEntity:對方的類型
             * mappedBy: 自己在對方中的屬性名 (ps:mappedBy出現在哪一方,哪一方意味着要放棄外鍵維護)
             * */
             @OneToMany(targetEntity=LinkMan.class,mappedBy="customer",cascade=CascadeType.ALL)
             private Set<LinkMan> linkmans=new HashSet<LinkMan>();

LinkMan:
        @Entity
        @Table(name="cst_linkman")
        public class LinkMan
        {
              @Id
              @Column(name="lkm_id")
              @GeneratedValue(strategy=GenerationType.IDENTITY)
              private Long lkm_id;// '聯系人編號(主鍵)',
              
              @Column(name="lkm_name")
              private String lkm_name;// '聯系人姓名',
              
              @Column(name="lkm_gender")
              private String lkm_gender;// '聯系人性別',
              
              @Column(name="lkm_phone")
              private String lkm_phone;// '聯系人辦公電話',
              
              @Column(name="lkm_mobile")
              private String lkm_mobile;// '聯系人手機',
              
              @Column(name="lkm_email")
              private String lkm_email;// '聯系人郵箱',
              
              @Column(name="lkm_qq")
              private String lkm_qq;//'聯系人qq',
              
              @Column(name="lkm_position")
              private String lkm_position;// '聯系人職位',
              
              @Column(name="lkm_memo")
              private String lkm_memo;// '聯系人備注',
              
              // 在多的一方有一的一方的對象--外鍵
              @ManyToOne(targetEntity=Customer.class,cascade=CascadeType.ALL)
             /* name:外鍵的字段名
              referencedColumnName:指向的主鍵字段名*/
              @JoinColumn(name="lkm_cust_id",referencedColumnName="cust_id")
              private Customer customer;

              
              
              
              
              
(多對多的關系案例:)
Role:
        @Entity
        @Table(name="sys_role")
        public class Role
        {
             @Id
             @Column(name="role_id")
             @GeneratedValue(strategy=GenerationType.IDENTITY)
             private Long role_id;// id
            
             @Column(name="role_name")
             private String role_name;//'角色名稱',
            
             @Column(name="role_memo")
             private String role_memo;// '備注',
            
             // 有用戶的集合
             /*
              * targetEntity:對方的類型
              * mappedBy:自己在對方中的屬性名
              * */
             @ManyToMany(targetEntity=User.class,mappedBy="roles",cascade=CascadeType.PERSIST)
             private Set<User> users=new HashSet<User>();
            
User:
        @Entity
        @Table(name="sys_user")
        public class User
        {
            @Id
            @Column(name="user_id")
            @GeneratedValue(strategy=GenerationType.IDENTITY)
            private Long user_id;// '用戶id',
            
            @Column(name="user_code")
            private String user_code;//'用戶賬號',
            
            @Column(name="user_name")
            private String user_name;// '用戶名稱',
            
            @Column(name="user_password")
            private String user_password;// '用戶密碼',
            
            @Column(name="user_state")
            private String user_state;// '1:正常,0:暫停',
            
            // 有角色的集合
            /*targetEntity:對方的類型
             *
             * */
            @ManyToMany(targetEntity=Role.class,cascade=CascadeType.ALL)
            /*name: 中間表的名稱
            joinColumns:自己在中間的一些配置
            inverseJoinColumns:對方在中間表的一些配置*/
            @JoinTable(name="sys_user_role",
            joinColumns={
                    /*name:自己在中間表的字段名
                    referencedColumnName:指向自己主鍵的字段名*/
                @JoinColumn(name="user_id",referencedColumnName="user_id")            
            },
            inverseJoinColumns={
                    /*name:對方在中間表的字段名
                    referencedColumnName:指向對方主鍵的字段名*/
                    @JoinColumn(name="role_id",referencedColumnName="role_id")
            })
             private Set<Role> roles=new HashSet<Role>();
           

 

 

 

1.1 JAP和hibernate中操作數據的方法對照

操作

Hibernate中的方法

JPA中的方法

說明

保存操作

save(Object entity)

persist(Object entity)

共同點:都是把臨時態對象轉成了持久態。

區別:

提供者不一樣:

       save方法是hibernate提供的。

       persist方法是JPA規范提供的。

在沒有事務的情況下:

       save會去數據庫中保存,hibernate提供了一個內置的事務來執行。

       persist什么都不會做。

更新操作

update (Object entity)

merge (Object entity)

Hibernate和jpa都可以利用快照機制,不調用任何方法去更新。

Update方法在更新時,如果遇到一級緩存已經包含了一個相同OID的對象會報錯。merge則可以執行成功。

刪除操作

delete (Object entity)

remove (Object entity)

都是刪除一個實體

查詢一個操作

get (Class clazz,Serializable id)

load(Class clazz,Serializable id)

find(Class clazz,Object id)

getReerence(Class clazz,Object id)

get和find都是立即加載。load和getReference一樣都是延遲加載。

查詢所有操作

Query:使用HQL語句查詢

Query:使用JPQL查詢

查詢語句的形式不一樣。

查詢返回唯一結果操作

uniqueResult()

getSingleResult()

查詢都是返回一個唯一的結果。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM