才高行厚的hibernate(2)---hibernate的映射

来源:互联网 发布:计算注册码软件 编辑:程序博客网 时间:2024/06/13 00:36

http://blog.csdn.net/senssic/article/details/13283905


集合映射

1.使用xml

集合类:
一下类全部省略getter和setter方法
[java] view plaincopyprint?
  1. package hibernate.senssic.mapping;  
  2.   
  3.   
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import java.util.Set;  
  7.   
  8.   
  9. public class CollectionMapping {  
  10.     private String cid;  
  11.     private String desc;  
  12.     private Set<Student> studs;  
  13.     private List<Teacher> lteach;  
  14.     private Map<String, String> mtuds;  
  15.     private Set<Student> bagstuds;  
  16.     private List<Teacher> idbagltuds;  
  17.     private String[] strs;  
  18.   
  19. }  
辅助类student:
[java] view plaincopyprint?
  1. package hibernate.senssic.mapping;  
  2.   
  3.   
  4. import java.util.Date;  
  5.   
  6.   
  7. public class Student {  
  8.     private String id;  
  9.     private Date name;  
  10.   
  11. }  

辅助类teacher类:
[java] view plaincopyprint?
  1. package hibernate.senssic.mapping;  
  2.   
  3.   
  4. public class Teacher {  
  5.     private String id;  
  6.     private String name;  
  7.     private int inx;  
  8.   
  9. }  
xml映射:
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping package="hibernate.senssic.mapping">  
  6.     <!-- 上面已经配置package,下面的class只需要写类名即可 -->  
  7.       <class name="CollectionMapping">  
  8.          <id name="cid">  
  9.            <!--有这么几种设置:  
  10. increment用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。  
  11. identity  
  12. 对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。  
  13. sequence  
  14. 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。  
  15. hilo  
  16. 使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key 和next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。  
  17. seqhilo  
  18. 使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。  
  19. uuid  
  20. 用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。  
  21. guid  
  22. 在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串。  
  23. native  
  24. 根据底层数据库的能力选择identity, sequence 或者hilo中的一个。  
  25. assigned  
  26. 让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。  
  27. select  
  28. 通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。  
  29. foreign  
  30. 使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。 -->  
  31.            <generator class="uuid"></generator>  
  32.          </id>  
  33.          <property name="desc" column="des" length="200" ></property>  
  34.          <!-- 数组的映射 -->  
  35.          <array name="strs" table="aray" >  
  36.          <key column="aryid"></key>  
  37.             <index column="strinx"></index>  
  38.             <element column="str" type="string"></element>  
  39.          </array>  
  40.          <!-- set映射不可重复,不记录顺序 -->  
  41.          <set name="studs" table="sstudent"  >  
  42.            <key column="cid" not-null="true"></key>  
  43.            <element column="name" type="java.util.Date"></element>  
  44.          </set>  
  45.          <!-- List映射可重复,但需记录顺序,需要有记录索引 -->  
  46.          <list name="lteach" table="teacher">  
  47.            <key column="cid"  not-null="true"></key>  
  48.            <index column="inx" type="int"></index>  
  49.            <element column="name" type="string"></element>  
  50.          </list>  
  51.          <!-- map映射需要对应的key和value映射 -->  
  52.          <map name="mtuds" table="mstudent" >  
  53.            <key column="cid" not-null="true"></key>  
  54.           <map-key type="string" column="mkey"></map-key>  
  55.           <element type="string" column="value"></element>  
  56.          </map>  
  57.          <!-- bag映射可重复,且不记录顺序。 -->  
  58.          <bag name="bagstuds">  
  59.            <key column="cid"  not-null="true"></key>  
  60.             <element column="name" type="java.util.Date"></element>  
  61.          </bag>  
  62.          <!-- idbag映射集合映射的一种扩展。可以在定义Bag映射时,为每一个添加的对象指定“id”,让Hibernate可以直接确定要更新的数据。 -->  
  63.          <idbag name="idbagltuds">  
  64.           <collection-id type="int" column="inx">  
  65.              <generator class="uuid"></generator>  
  66.            </collection-id>  
  67.             <key column="cid" ></key>  
  68.             <element column="name" type="java.util.Date"></element>  
  69.          </idbag>  
  70.            
  71.       </class>  
  72.     </hibernate-mapping>  

2.使用注解

在hibernate配置文件中加入:
[java] view plaincopyprint?
  1. <mapping class="hibernate.senssic.mapping.CollectionMapping"/>   
  2.        <mapping class="hibernate.senssic.mapping.Student"/>   
  3.        <mapping  class="hibernate.senssic.mapping.Teacher"/>  
主类Collectionmapping类:
[java] view plaincopyprint?
  1. package hibernate.senssic.mapping;  
  2.   
  3. import java.util.List;  
  4. import java.util.Map;  
  5. import java.util.Set;  
  6.   
  7. import javax.persistence.Column;  
  8. import javax.persistence.Entity;  
  9. import javax.persistence.GeneratedValue;  
  10. import javax.persistence.GenerationType;  
  11. import javax.persistence.Id;  
  12. import javax.persistence.MapKey;  
  13. import javax.persistence.OneToMany;  
  14. import javax.persistence.Table;  
  15.   
  16. import org.hibernate.annotations.IndexColumn;  
  17.   
  18. @Entity  
  19. @Table(name = "collectionmap")  
  20. public class CollectionMapping {  
  21.     @Id  
  22.     @GeneratedValue(strategy = GenerationType.IDENTITY)  
  23.     private int id;  
  24.   
  25.     @Column(length = 200)  
  26.     private String des;  
  27.     @OneToMany(mappedBy = "cid")  
  28.     private Set<Student> studs;  
  29.     @OneToMany(mappedBy = "cid")  
  30.     @IndexColumn(name = "id")  
  31.     private List<Teacher> teacher;  
  32.     @OneToMany(mappedBy = "cid")  
  33.     @MapKey  
  34.     private Map<Integer, Student> mapts;  
  35.     @OneToMany(mappedBy = "cid")  
  36.     @IndexColumn(name = "id")  
  37.     private Student[] stuts;  
  38.   
  39.       
  40. }  
辅类student类:
[java] view plaincopyprint?
  1. package hibernate.senssic.mapping;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import javax.persistence.Column;  
  6. import javax.persistence.Entity;  
  7. import javax.persistence.GeneratedValue;  
  8. import javax.persistence.GenerationType;  
  9. import javax.persistence.Id;  
  10. import javax.persistence.JoinColumn;  
  11. import javax.persistence.ManyToOne;  
  12.   
  13. @Entity  
  14. public class Student {  
  15.     @Id  
  16.     @GeneratedValue(strategy = GenerationType.IDENTITY)  
  17.     private int id;  
  18.     @Column(name = "sdate")  
  19.     private Date name;  
  20.     @ManyToOne  
  21.     @JoinColumn(name = "cid", nullable = false, referencedColumnName = "id")  
  22.     private CollectionMapping cid;  
  23.   
  24.       
  25. }  

辅类Teacher类:
[java] view plaincopyprint?
  1. package hibernate.senssic.mapping;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.Entity;  
  5. import javax.persistence.GeneratedValue;  
  6. import javax.persistence.GenerationType;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.JoinColumn;  
  9. import javax.persistence.ManyToOne;  
  10.   
  11. @Entity  
  12. public class Teacher {  
  13.     @Id  
  14.     @GeneratedValue(strategy = GenerationType.IDENTITY)  
  15.     private int id;  
  16.     @Column  
  17.     private String name;  
  18.     @Column  
  19.     private int inx;  
  20.     @ManyToOne  
  21.     @JoinColumn(name = "conid", referencedColumnName = "id", nullable = false)  
  22.     private CollectionMapping cid;  
  23.   
  24. }  

组件映射

特点:一个表映射多个类

1.使用xml配置

主类User类:
[java] view plaincopyprint?
  1. package hibernate.senssic.component;  
  2.   
  3. public class User {  
  4.     private int id;  
  5.     private String name;  
  6.     private String pasd;  
  7.     private Pro pro;  
  8.   
  9. }  
辅类Pro类:
[java] view plaincopyprint?
  1. package hibernate.senssic.component;  
  2.   
  3. public class Pro {  
  4.     private String address;  
  5.     private int phon;  
  6.   
  7.       
  8. }  
xml配置:
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping package="hibernate.senssic.component">  
  6.     <class name="User">  
  7.        <id name="id">  
  8.          <generator class="uuid"></generator>  
  9.        </id>  
  10.        <property name="name" ></property>  
  11.        <property name="pasd"></property>  
  12.        <component name="pro" class="Pro">  
  13.            <property name="address"></property>  
  14.            <property name="phon"></property>  
  15.        </component>  
  16.     </class>  
  17.     </hibernate-mapping>  
若想实现双向关联,即从profile对象也可找到user对象,只需
在以上的基础上,改动两个地方:A.在profile类中增加user对象属性。B.在映射文件的<component></component>中增加一行
 <parent name="user"/>

2.使用注解

user类:
[java] view plaincopyprint?
  1. package hibernate.senssic.component;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.Embedded;  
  5. import javax.persistence.Entity;  
  6. import javax.persistence.GeneratedValue;  
  7. import javax.persistence.GenerationType;  
  8. import javax.persistence.Id;  
  9.   
  10. @Entity  
  11. public class User {  
  12.     @Id  
  13.     @GeneratedValue(strategy = GenerationType.IDENTITY)  
  14.     private int id;  
  15.     @Column  
  16.     private String name;  
  17.     @Column  
  18.     private String pasd;  
  19.     @Embedded  
  20.     private Pro pro;  
  21.   
  22.       
  23. }  

Pro类:
[java] view plaincopyprint?
  1. package hibernate.senssic.component;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.Embeddable;  
  5.   
  6. import org.hibernate.annotations.Parent;  
  7.   
  8. @Embeddable  
  9. public class Pro {  
  10.     @Parent  
  11.     private User user;  
  12.     @Column  
  13.     private String address;  
  14.     @Column  
  15.     private int phon;  
  16.   
  17.       
  18. }  
组件集合映射
其实和集合映射类似,只是在将集合作为属性时,集合里的元素不是表中的一个字段(基本类型),而是由组件(复合类型:类)映射表示。
配置时,在<set></set>中添加:

[html] view plaincopyprint?
  1. <set name="user" table="sstudent"  >  
  2.           <composite-element class="Pro">  
  3.             <property name="adderss"></property>  
  4.             <property name="phon"></property>  
  5.           </composite-element>  
  6.         </set>  
如果也想实现双向关联除了在Pro中加入user还需要配置

[html] view plaincopyprint?
  1. <composite-element class="Pro">  
  2.               <parent name="user"/>  
  3.              <property name="adderss"></property>  
  4.              <property name="phon"></property>  
  5.            </composite-element>  

关联映射

单向关联

一对一外键单向关联

类:
Person类
[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3. public class Person {  
  4.     private int id;  
  5.     private String name;  
  6.     private Pro pro;  
  7.   
  8.       
  9. }  
Pro类
[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3. public class Pro {  
  4.     private int aid;  
  5.     private String address;  
  6.     private String phon;  
  7.   
  8.       
  9. }  

配置文件:
person.cfg.xml
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.       <class name="hibernate.senssic.relevance.Person">  
  7.         <id name="id">  
  8.           <generator class="uuid"></generator>  
  9.         </id>  
  10.         <property name="name"></property>  
  11.        <many-to-one name="pro" foreign-key="address"></many-to-one><!--一对一外键单向关联-->  
  12.       </class>  
  13.     </hibernate-mapping>  
pro.cfg.xml
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.     <class name="hibernate.senssic.relevance.Pro">  
  7.       <id name="aid">  
  8.        <generator class="uuid"></generator>  
  9.       </id>  
  10.       <property name="address"></property>  
  11.       <property name="phon"></property>  
  12.     </class>  
  13.     </hibernate-mapping>  

一对一主键单向关联

需要改动的地方只有:
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.       <class name="hibernate.senssic.relevance.Person">  
  7.         <id name="id">  
  8.             <!--一对一主键关联-->  
  9.           <generator class="foreign">  
  10.             <param name="property">pro</param>  
  11.           </generator>  
  12.         </id>  
  13.         <property name="name"></property>  
  14.        <one-to-one name="pro" constrained="true"></one-to-one>  
  15.       </class>  
  16.     </hibernate-mapping>  

一对多外键单向关联

两个类:
[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3. import java.util.Set;  
  4.   
  5. public class Person {  
  6.     private int id;  
  7.     private String name;  
  8.     private Set<Pro> spro;  
  9.   
  10.       
  11. }  

[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3. public class Pro {  
  4.     private int aid;  
  5.     private String address;  
  6.     private String phon;  
  7.   
  8. }  

两个配置文件:
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.       <class name="hibernate.senssic.relevance.Person">  
  7.         <id name="id">  
  8.           <generator class="uuid">  
  9.              
  10.           </generator>  
  11.         </id>  
  12.         <property name="name"></property>  
  13.         <set name="pro" table="pro">  
  14.           <key column="proid"></key>  
  15.           <one-to-many class="hibernate.senssic.relevance.Pro"/>  
  16.         </set>  
  17.       </class>  
  18.     </hibernate-mapping>  

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.     <class name="hibernate.senssic.relevance.Pro">  
  7.       <id name="aid">  
  8.        <generator class="uuid"></generator>  
  9.       </id>  
  10.       <property name="address"></property>  
  11.       <property name="phon"></property>  
  12.     </class>  
  13.     </hibernate-mapping>  

多对一外键单向关联

两个类省略setter和getter方法:
[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3. import java.util.Set;  
  4.   
  5. public class Person {  
  6.     private int id;  
  7.     private String name;  
  8.     private Pro pro;  
  9. }  

[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3. public class Pro {  
  4.     private int aid;  
  5.     private String address;  
  6.     private String phon;  
  7. }  
只需要更改的配置文件:
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.       <class name="hibernate.senssic.relevance.Person">  
  7.         <id name="id">  
  8.           <generator class="uuid">  
  9.              
  10.           </generator>  
  11.         </id>  
  12.         <property name="name"></property>  
  13.         <!-- 用来映射关联address在Pro表中的外键列名-->  
  14.     <many-to-one name="pro" column="address"></many-to-one>  
  15.       </class>  
  16.     </hibernate-mapping>  

双向关联

一对一外键双向关联

两个类无getter和setter:
[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3. public class Pro {  
  4.     private int aid;  
  5.     private Person person;  
  6.     private String address;  
  7. }  
[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3.   
  4. public class Person {  
  5.     private int id;  
  6.     private String name;  
  7.     private Pro pro;  
  8. }  
两个配置文件:
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.       <class name="hibernate.senssic.relevance.Person">  
  7.         <id name="id">  
  8.           <generator class="uuid">  
  9.              
  10.           </generator>  
  11.         </id>  
  12.         <property name="name"></property>  
  13.        <one-to-one name="pro" property-ref="person"></one-to-one>  
  14.       
  15.       </class>  
  16.     </hibernate-mapping>  

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.     <class name="hibernate.senssic.relevance.Pro">  
  7.       <id name="aid">  
  8.        <generator class="uuid"></generator>  
  9.       </id>  
  10.       <property name="address"></property>  
  11.        <many-to-one name="person" column="personid"></many-to-one>  
  12.     </class>  
  13.     </hibernate-mapping>  

一对一主键双向关联

值需要改:
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.     <class name="hibernate.senssic.relevance.Pro">  
  7.       <id name="aid">  
  8.        <generator class="foreign">  
  9.          <param name="property">person</param>  
  10.        </generator>  
  11.       </id>  
  12.       <property name="address"></property>  
  13.      <one-to-one name="person" constrained="true"></one-to-one>  
  14.     </class>  
  15.     </hibernate-mapping>  

一对多外键双向关联

类:
[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3. import java.util.Set;  
  4.   
  5. public class Person {  
  6.     private int id;  
  7.     private String name;  
  8.     private Set<Pro> pro;  
  9. }  
[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3. public class Pro {  
  4.     private int aid;  
  5.     private Person person;  
  6.     private String address;  
  7. }  

配置文件:
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.       <class name="hibernate.senssic.relevance.Person">  
  7.         <id name="id">  
  8.           <generator class="uuid">  
  9.              
  10.           </generator>  
  11.         </id>  
  12.         <property name="name"></property>  
  13.        <set name="pro" inverse="true">  
  14.          <key column="addid"></key>  
  15.           <one-to-many class="hibernate.senssic.relevance.Pro"/>  
  16.        </set>  
  17.       
  18.       </class>  
  19.     </hibernate-mapping>  

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.     <class name="hibernate.senssic.relevance.Pro">  
  7.       <id name="aid">  
  8.        <generator class="foreign">  
  9.          <param name="property">person</param>  
  10.        </generator>  
  11.       </id>  
  12.       <property name="address"></property>  
  13.      <many-to-one  name="person"></many-to-one>  
  14.     </class>  
  15.     </hibernate-mapping>  

多对多双向关联

两个类:
[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3. import java.util.Set;  
  4.   
  5. public class Pro {  
  6.     private int aid;  
  7.     private Set<Person> person;  
  8.     private String address;  
  9. }  

[java] view plaincopyprint?
  1. package hibernate.senssic.relevance;  
  2.   
  3. import java.util.Set;  
  4.   
  5. public class Person {  
  6.     private int id;  
  7.     private String name;  
  8.     private Set<Pro> pro;  
  9. }  

配置文件:
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.     <class name="hibernate.senssic.relevance.Pro">  
  7.       <id name="aid">  
  8.        <generator class="foreign">  
  9.          <param name="property">person</param>  
  10.        </generator>  
  11.       </id>  
  12.       <property name="address"></property>  
  13.        <set name="pro">  
  14.          <key column="proid"></key>  
  15.          <many-to-many column="person" class="hibernate.senssic.relevance.Person"></many-to-many>  
  16.        </set>  
  17.     </class>  
  18.     </hibernate-mapping>  
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.     <hibernate-mapping>  
  6.       <class name="hibernate.senssic.relevance.Person">  
  7.         <id name="id">  
  8.           <generator class="uuid">  
  9.              
  10.           </generator>  
  11.         </id>  
  12.         <property name="name"></property>  
  13.        <set name="pro" inverse="true">  
  14.          <key column="personid"></key>  
  15.         <many-to-many column="addreid" class="hibernate.senssic.relevance.Pro"></many-to-many>  
  16.        </set>  
  17.       
  18.       </class>  
  19.     </hibernate-mapping>  

使用注解实现关系映射:

实例的实体是user和role,主键分别是userid和roleid
 1)一对一外键关联映射(单向)
 @OneToOne(cascade=CascadeType.ALL)  //一对一外键关联,使用@OneToOne,并设置了级联操作
 @JoinColumn(name="userid",unique=true)   //@JoinColum设置了外键的名称为userid(数据库字段名),如果不设置,则默认为另一类的属性名+ _id。外键的值是唯一的(unique),不可重复,与另一类的主键一直
 
 2)一对一外键关联映射(双向)
 @OneToOne(mappedBy=" role",cascade=CascadeType.ALL)  //一对一双向关联关系,使用@OneToOne。注意:需要加上mappedBy="role",如果不加上的话, role 也会生成一个外键(user_id),mappedby="role"需要指向与他关联对象的一个属性,说明双向关联关系中,有且仅有一端是作为主体(owner)端存在的,主体端负责维护联接列,对于不需要维护这种关系的从表则通过mappedBy属性进行声明,mappedBy的值指向主体的关联属性
 //规律:只有是双向关联关系,都加上mappedby,cascade=CascadeType.ALL级联


  3)一对一主键关联映射(不重要)
 在实际中很少用,使用注解@PrimaryKeyJoinColumn,意思是说,我的主键去参考另外一张表中的主键,作为我的主键,但是在我测试使用注解一对一主键关联映射,在生成表的时候,数据库中并没有生成关联,使用XML映射可以生成。Annotation注解一对一主键关联映,有些bug。不过没空去研究它。因为在实际开发中一对一很少用,主键关联就更少了


 4)多对一关联映射
 多端配置
 @ManyToOne(targetEntity=role.class)  //多对一注解@ManyToOne;targetEntity指定了关联对象
 @JoinColumn(name="userid")  //@JoinColumn(name="userid")指定生产的外键的字段名,默认是org_id


 5)一对多关联映射(单向)
 @OneToMany   //一对多注解@OneToMany(单向),如果只写@OneToMany的话,hibernate会建一张中间表来维护他们之间的关系
 @JoinColumn(name="roleid")    //加上@JoinColumn(name="roleid"),则不会建中间表,他会在多的一端加上外键roleid,来维护他们之间的关系


 6)一对多关联映射(双向)
 一端配置
 @OneToMany(mappedBy="role")  //一对多双向,在一的一端中设置mappedBy,说明多的一端为主导
 @JoinColumn(name="roleid")  //如果指定了外键字段名称,则多的一端也需要指定相同的字段名称
 多端配置
 @ManyToOne  //一对多双向
 @JoinColumn(name=" roleid ") //需要指定外键与一的一端给的外键名称一致,@JoinColumn(name=" roleid "),也可以不指定,如果在多的一端不指定,则一的一端也不能指定,否则为生成两个外键


 7)多对多关联映射(单向)
 @ManyToMany  //多对多映射:注解@ManyToMany(单向),默认情况下,hibernate会自动的创建一张中间表来维护多对多关系
  默认中间表的名称 :user_role中间表,字段的名称user_id role_id,如果想更换表名和字段名称,注解如下:
 @JoinTable(name="t_u_r",joinColumns={@JoinColumn(name="u_id")},inverseJoinColumns={@JoinColumn(name="r_id")})
 
 8)多对多关联映射(双向)
 user端
 @ManyToMany  //多对多映射:注解@ManyToMany(单向);默认情况下,hibernate会自动的创建一张中间表,来维护多对多关系;默认中间表的名称 :user_role中间表,字段的名称user_id role_id
 如果想更换表名和字段名称,注解如下:
 @JoinTable(name="t_u_r",joinColumns={@JoinColumn(name="u_id")},inverseJoinColumns={@JoinColumn(name="r_id")})  //@JoinTable(name="t_u_r"),指定中间表的表名;joinColumns={@JoinColumn(name="u_id")},指定当前对象的外键;inverseJoinColumns={@JoinColumn(name="r_id")},指定关联对象的外键
 role端
 @ManyToMany(mappedBy="role")   //多对多,双向关联映射

继承映射

关系数据库的世界中,表与表之间没有任何关键字可以明确指明这两张表的父子关系,表与表是没有继承关系这样的说法的。为了将程序领域中的继承关系反映到数据中,

Hibernate为我们提供了3中方案:

假设有这么三个类:

[java] view plaincopyprint?
  1. public class People  
  2. {  
  3.     /*父类所拥有的属性*/  
  4.     private String id;  
  5.     private String name;  
  6.     private String sex;  
  7.     private String age;  
  8.     private Timestamp birthday;  
  9.       
  10.     /*get和set方法*/  
  11. }  



[java] view plaincopyprint?
  1. public class Student extends People  
  2. {  
  3.     /*学生独有的属性*/  
  4.     private String cardId;//学号  
  5.   
  6.     public String getCardId()  
  7.     {  
  8.         return cardId;  
  9.     }  
  10.   
  11.     public void setCardId(String cardId)  
  12.     {  
  13.         this.cardId = cardId;  
  14.     }  
  15. }  

[java] view plaincopyprint?
  1. public class Teacher extends People  
  2. {  
  3.     /*Teacher所独有的属性*/  
  4.     private int salary;//工资  
  5.   
  6.     public int getSalary()  
  7.     {  
  8.         return salary;  
  9.     }  
  10.   
  11.     public void setSalary(int salary)  
  12.     {  
  13.         this.salary = salary;  
  14.     }  
  15. }  

第一种方案:一个子类对应一张表。

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  3.   
  4. <hibernate-mapping>  
  5.     <class name="hibernate.senssic.People" abstract="true">  
  6.         <id name="id" type="string">  
  7.             <column name="id"></column>  
  8.             <generator class="uuid"></generator>  
  9.         </id>  
  10.   
  11.         <property name="name" column="name" type="string"></property>  
  12.         <property name="sex" column="sex" type="string"></property>  
  13.         <property name="age" column="age" type="string"></property>  
  14.         <property name="birthday" column="birthday" type="timestamp"></property>  
  15.   
  16.         <!--   
  17.         <union-subclass name="hibernate.senssic.Student" table="student">   
  18.             <property name="cardId" column="cardId" type="string"></property>   
  19.         </union-subclass>   
  20.         <union-subclass name="hibernate.senssic.Teacher" table="teacher">   
  21.             <property name="salary" column="salary" type="integer"></property>   
  22.         </union-subclass>   
  23.         -->  
  24.     </class>  
  25.     <union-subclass name="hibernate.senssic.Student"  
  26.         table="student" extends="hibernate.senssic.People">  
  27.         <property name="cardId" column="cardId" type="string"></property>  
  28.     </union-subclass>  
  29.   
  30.     <union-subclass name="hibernate.senssic.Teacher"  
  31.         table="teacher" extends="hibernate.senssic.People">  
  32.         <property name="salary" column="salary" type="integer"></property>  
  33.     </union-subclass>  
  34. </hibernate-mapping>  


第二种方案:使用一张表表示所有继承体系下的类的属性的并集。

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  3.   
  4. <hibernate-mapping>  
  5.     <class name="hibernate.senssic.People" table="people">  
  6.         <id name="id" type="string">  
  7.             <column name="id"></column>  
  8.             <generator class="uuid"></generator>  
  9.         </id>  
  10.   
  11.         <discriminator column="peopleType" type="string"></discriminator>  
  12.   
  13.         <property name="name" column="name" type="string"></property>  
  14.         <property name="sex" column="sex" type="string"></property>  
  15.         <property name="age" column="age" type="string"></property>  
  16.         <property name="birthday" column="birthday" type="timestamp"></property>  
  17.   
  18.         <subclass name="hibernate.senssic.Student" discriminator-value="student">  
  19.             <property name="cardId" column="cardId" type="string"></property>  
  20.         </subclass>  
  21.           
  22.         <subclass name="hibernate.senssic.Teacher" discriminator-value="teacher">  
  23.             <property name="salary" column="salary" type="string"></property>  
  24.         </subclass>  
  25.     </class>  
  26. </hibernate-mapping>  


第三种方案:每个子类使用一张表只存储它特有的属性,然后与父类所对应的表以一对一主键关联的方式关联起来。

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  3.   
  4. <hibernate-mapping>  
  5.     <class name="hibernate.senssic.People" table="people">  
  6.         <id name="id" type="string">  
  7.             <column name="id"></column>  
  8.             <generator class="uuid"></generator>  
  9.         </id>  
  10.   
  11.         <property name="name" column="name" type="string"></property>  
  12.         <property name="sex" column="sex" type="string"></property>  
  13.         <property name="age" column="age" type="string"></property>  
  14.         <property name="birthday" column="birthday" type="timestamp"></property>  
  15.           
  16.         <joined-subclass name="hibernate.senssic.Student" table="student">  
  17.             <key column="id"></key>  
  18.             <property name="cardId" column="cardId" type="string"></property>  
  19.         </joined-subclass>  
  20.           
  21.         <joined-subclass name="hibernate.senssic.Teacher" table="teacher">  
  22.             <key column="id"></key>  
  23.             <property name="salary" column="salary" type="integer"></property>  
  24.         </joined-subclass>  
  25.     </class>  
  26. </hibernate-mapping>  

使用注解来实现继承映射:

http://blog.csdn.net/senssic/article/details/13421201

hibernate的联合主键

如果使用联合主键,而不是实体对应的id自动生成,则需要抽象出联合主键为一个类,并需要实现序列化接口,和覆盖equals方法,最好覆盖hashCode方法(用于比较对象)。
1.使用xml
抽象主键类:
[java] view plaincopyprint?
  1. package hibernate.senssic.compositeid;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class ComposiTidPK implements Serializable {  
  6.     // 联合主键,使用name和email作为主键,需要实现序列化接口,和覆写hashCode和equals方法  
  7.     private String name;  
  8.     private String email;  
  9.   
  10.     public String getName() {  
  11.         return name;  
  12.     }  
  13.   
  14.     public void setName(String name) {  
  15.         this.name = name;  
  16.     }  
  17.   
  18.     public String getEmail() {  
  19.         return email;  
  20.     }  
  21.   
  22.     public void setEmail(String email) {  
  23.         this.email = email;  
  24.     }  
  25.   
  26.     @Override  
  27.     public int hashCode() {  
  28.         final int prime = 31;  
  29.         int result = 1;  
  30.         result = prime * result + ((email == null) ? 0 : email.hashCode());  
  31.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  32.         return result;  
  33.     }  
  34.   
  35.     @Override  
  36.     public boolean equals(Object obj) {  
  37.         if (this == obj)  
  38.             return true;  
  39.         if (obj == null)  
  40.             return false;  
  41.         if (getClass() != obj.getClass())  
  42.             return false;  
  43.         ComposiTidPK other = (ComposiTidPK) obj;  
  44.         if (email == null) {  
  45.             if (other.email != null)  
  46.                 return false;  
  47.         } else if (!email.equals(other.email))  
  48.             return false;  
  49.         if (name == null) {  
  50.             if (other.name != null)  
  51.                 return false;  
  52.         } else if (!name.equals(other.name))  
  53.             return false;  
  54.         return true;  
  55.     }  
  56.   
  57. }  

实体类:
[java] view plaincopyprint?
  1. package hibernate.senssic.compositeid;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class ComposiTid {  
  6.     private String adder;  
  7.     private Date date;  
  8.     private ComposiTidPK cPk;  
  9.   
  10.     public String getAdder() {  
  11.         return adder;  
  12.     }  
  13.   
  14.     public void setAdder(String adder) {  
  15.         this.adder = adder;  
  16.     }  
  17.   
  18.     public Date getDate() {  
  19.         return date;  
  20.     }  
  21.   
  22.     public void setDate(Date date) {  
  23.         this.date = date;  
  24.     }  
  25.   
  26.     public ComposiTidPK getcPk() {  
  27.         return cPk;  
  28.     }  
  29.   
  30.     public void setcPk(ComposiTidPK cPk) {  
  31.         this.cPk = cPk;  
  32.     }  
  33. }  

xml映射文件配置:
[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.    <hibernate-mapping package="hibernate.senssic.compositeid">  
  6.      <class name="ComposiTid">  
  7.          <composite-id name="cPk">  
  8.               <key-property name="name"></key-property>  
  9.               <key-property name="email"></key-property>  
  10.           </composite-id>  
  11.           <property name="adder"></property>  
  12.           <property name="date"></property>  
  13.       </class>  
  14.    </hibernate-mapping>  
2.使用注解
抽象联合主键类注解:
[java] view plaincopyprint?
  1. package hibernate.senssic.compositeid;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.persistence.Column;  
  6. import javax.persistence.Embeddable;  
  7.   
  8. @Embeddable  
  9. public class ComposiTidPK implements Serializable {  
  10.     // 联合主键,使用name和email作为主键,需要实现序列化接口,和覆写hashCode和equals方法  
  11.     @Column  
  12.     private String name;  
  13.     @Column  
  14.     private String email;  
  15.   
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.   
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.   
  24.     public String getEmail() {  
  25.         return email;  
  26.     }  
  27.   
  28.     public void setEmail(String email) {  
  29.         this.email = email;  
  30.     }  
  31.   
  32.     @Override  
  33.     public int hashCode() {  
  34.         final int prime = 31;  
  35.         int result = 1;  
  36.         result = prime * result + ((email == null) ? 0 : email.hashCode());  
  37.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  38.         return result;  
  39.     }  
  40.   
  41.     @Override  
  42.     public boolean equals(Object obj) {  
  43.         if (this == obj)  
  44.             return true;  
  45.         if (obj == null)  
  46.             return false;  
  47.         if (getClass() != obj.getClass())  
  48.             return false;  
  49.         ComposiTidPK other = (ComposiTidPK) obj;  
  50.         if (email == null) {  
  51.             if (other.email != null)  
  52.                 return false;  
  53.         } else if (!email.equals(other.email))  
  54.             return false;  
  55.         if (name == null) {  
  56.             if (other.name != null)  
  57.                 return false;  
  58.         } else if (!name.equals(other.name))  
  59.             return false;  
  60.         return true;  
  61.     }  
  62.   
  63. }  

实体类:
[java] view plaincopyprint?
  1. package hibernate.senssic.compositeid;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import javax.persistence.Column;  
  6. import javax.persistence.Entity;  
  7. import javax.persistence.Id;  
  8.   
  9. @Entity  
  10. public class ComposiTid {  
  11.     @Column  
  12.     private String adder;  
  13.     @Column  
  14.     private Date date;  
  15.     @Id  
  16.     private ComposiTidPK cPk;  
  17.   
  18.     public String getAdder() {  
  19.         return adder;  
  20.     }  
  21.   
  22.     public void setAdder(String adder) {  
  23.         this.adder = adder;  
  24.     }  
  25.   
  26.     public Date getDate() {  
  27.         return date;  
  28.     }  
  29.   
  30.     public void setDate(Date date) {  
  31.         this.date = date;  
  32.     }  
  33.   
  34.     public ComposiTidPK getcPk() {  
  35.         return cPk;  
  36.     }  
  37.   
  38.     public void setcPk(ComposiTidPK cPk) {  
  39.         this.cPk = cPk;  
  40.     }  
  41. }  

0 0