Hibernate4实战之注解版

来源:互联网 发布:重庆大学网络教学平台 编辑:程序博客网 时间:2024/05/24 01:32

Hibernate4实战之Hibernate4注解零配置


@Entity,注册在类头上,将一个类声明为一个实体bean(即一个持久化POJO类) 。
@Table,注册在类头上,注解声明了该实体bean映射指定的表(table)。
@Id用来注册主属性,@GeneratedValue用来注册主属性的生成策略,@Column用来注册属性,@Version用来注册乐观锁,@Transient用来注册不是属性。
以上的@Id、@GeneratedValue、 @Column 、 @Version,可以用来注册属性,既可以写在Java类的属性上,也可以注册在属性对应的getter上。
@Transient注册在多余的属性或多余的getter上,但是必须与以上的@Column等对应。
@Column
标识属性对应的字段,示例:@Column(name=“userName")

java代码:
查看复制到剪贴板打印
  1. @Column(  
  2.     name="columnName";                                (1)  
  3.     boolean unique() default false;                   (2)  
  4.     boolean nullable() default true;                  (3)  
  5.     boolean insertable() default true;                (4)  
  6.     boolean updatable() default true;                 (5)  
  7.     String columnDefinition() default "";             (6)  
  8.     String table() default "";                        (7)  
  9.     int length() default 255;                         (8)  
  10.     int precision() default 0// decimal precision   (9)  
  11.     int scale() default 0// decimal scale           (10)  
(1) name 可选,列名(默认值是属性名)
(2) unique 可选,是否在该列上设置唯一约束(默认值false)
(3) nullable 可选,是否设置该列的值可以为空(默认值false)
(4) insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)
(5) updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)
(6) columnDefinition 可选: 为这个特定列覆盖SQL DDL片段 (这可能导致无法在不同数据库间移植)
(7) table 可选,定义对应的表(默认为主表)
(8) length 可选,列长度(默认值255)
(8) precision 可选,列十进制精度(decimal precision)(默认值0)
(10) scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0)
@Id,标识这个属性是实体类的唯一识别的值。
注意:这个注解只能标注单一列构成的主键,如tbl_grade那种有两个字段组成的联合主键由其他注解标识。
回忆*.hbm.xml:
<id name= "uuid">
<generator class= "assigned"/>
        </id>
@Id,只是标识这个属性是主键,但是并没有指出其生成策略,如上例中的assigned就是由程序员指定的生成策略。
如果仅仅写出@Id,即是使用assigned生成略,如:

java代码:
查看复制到剪贴板打印
  1. @Id  
  2. @Column  
  3. private int uuid;  
  4. 如果想使用Oracle支持的sequence取主键,必须通过@GeneratedValue来指定生成策略,而由@SequenceGenerator指定如何使用sequence。  
  5. @Id  
  6. @Column  
  7. @GeneratedValue(  
  8. strategy = GenerationType.SEQUENCE,//使用sequence生成主键  
  9. generator =“generator“//引用下面名为gernator的生成策略  
  10. )  
  11. @SequenceGenerator(  
  12. name = “generator”,//定义名为generator的生成策略  
  13. allocationSize = 1//每次sequence加1  
  14. name=“seq_a”//引用名为seq_a的sequence  
  15. )  
  16. private int uuid;  
  17. @Version  
标识这个属性用来映射乐观锁的version
@Transient
标识这个属性不用持久化
@Embeddable【小对象的头上】
标识实体中可以定义一个嵌入式组件(embedded component)。组件类必须在类一级定义@Embeddable注解。
@Embedded【大对象的属性头上】
引用定义的小对象。
@Embeddable【小对象的头上】
标识实体中可以定义一个嵌入式组件(embedded component)。组件类必须在类一级定义@Embeddable注解。
注意:如果这个小对象作为复合主键,一定要实现Serializable接口。这并不是注解决定的,而是Hibernate的主键都需要实现Serializable接口。
@EmbeddedId 【大对象的属性头上】
引用定义的小对象作为主键。
注意:不需要再使用@Id注解。
  
标准的1:1
   
XML的配置

java代码:
查看复制到剪贴板打印
  1. 1【tbl_product】:  
  2. <one-to-one name="info" cascade="all"/>  
  3. 1【tbl_product_info】:  
  4. <id name="uuid">  
  5. <generator class=“foreign【写死,使用外来生成策略】">  
  6. <param name=“property”>product【引用自己的Java属性名】 </param>  
  7. </generator>  
  8. </id>  
  9. <one-to-one name="product"/>  
注解的配置

java代码:
查看复制到剪贴板打印
  1. 1【tbl_product】:  
  2. @OneToOne(cascade=CascadeType.ALL)  
  3. @PrimaryKeyJoinColumn  
  4. private ProductInfoModel info;  
  5. 1【tbl_product_info】:  
  6. @Id  
  7. @Column  
  8. @GeneratedValue(generator=“copy【引用生成策略】")  
  9. @GenericGenerator(name=“copy【定义生成策略】”,strategy=“foreign【写死,使用外来策略】”,parameters=@Parameter(name=“property”,value=“product【引用自己的Java属性】"))  
  10. private int uuid;  
  11. @OneToOne(mappedBy=“info【引用对方的Java属性】")  
  12. private ProductModel product;  
  13.    
标准的1:M
  
XML的配置


java代码:
查看复制到剪贴板打印
  1. 1【tbl_parent】:  
  2.  <set name="children">  
  3.         <key column=“puuid【对方的数据库外键列名】"/>  
  4.         <one-to-many class=“cn.javass.model.c.ChildModel【对方的Java类名】"/>  
  5.   </set>  
  6. 多【tbl_child】:  
  7. <many-to-one name=“parent” column=“puuid【自己的数据库外键列名】"/>  
注解的配置


java代码:
查看复制到剪贴板打印
  1. 1【tbl_parent】:  
  2. @OneToMany  
  3. @JoinColumn(name="puuid【对方的数据库外键列名】")  
  4. private Set<ChildModel> children = new HashSet<ChildModel>();  
  5. 多【tbl_child】:  
  6. @ManyToOne  
  7. @JoinColumn(name="puuid【自己的数据库外键列名】")  
  8. private ParentModel parent;  
  9.    
标准的1:M

 
XML的配置

java代码:
查看复制到剪贴板打印
  1. <set name=“courses” table=“tbl_grade【联接表】">  
  2.         <key column=“suuid【联接表里代表自己的数据库字段名】"/>  
  3.         <many-to-many column=“cuuid【联接表里代表对方的数据库字段名】” class=“cn.javass.model.e.CourseMode【对方的类名】l"/>  
  4. </set>  
  5. 注解的配置  
  6. @ManyToMany  
  7. @JoinTable(  
  8. name=“tbl_grade【联接表】",  
  9. joinColumns=@JoinColumn(name="suuid【联接表里代表自己的数据库字段名】"),  
  10. inverseJoinColumns=@JoinColumn(name="cuuid 【联接表里代表对方的数据库字段名】” )  
  11. )  
  12. private Set<CourseModel> courses = new HashSet<CourseModel>();  
  13.    
标准的1:M

   
XML的配置


java代码:
查看复制到剪贴板打印
  1. 1【tbl_product】:  
  2. <one-to-one name=“info” foreign-key=“puuid【对方的数据库外键列名】" cascade="all"/>  
  3. 1【tbl_product_info】:  
  4. <many-to-one name=“product” column=“puuid【自己的数据库外键列名】” unique=“true【写死】"/>  
注解的配置


java代码:
查看复制到剪贴板打印
  1. 1【tbl_product】:  
  2. @OneToOne(cascade=CascadeType.ALL,mappedBy=“product【对方的Java类属性名 】")  
  3. private ProductInfoModel info;  
  4. 1【tbl_product_info】:  
  5. @OneToOne  
  6. @JoinColumn(name=“puuid【自己的数据库外键列名】")  
  7. private ProductModel product;  
标准的1:M
 
  
 
 
XML的配置

java代码:
查看复制到剪贴板打印
  1. 1【tbl_parent】:  
  2. <set name=“children” table=“tbl_parent_child【联接表】">  
  3.         <key column=“puuid【联接表里代表自己的数据库列名】"/>  
  4.         <many-to-many column=“cuuid【联接表里代表对方的数据库列名】” unique=“true【写死】”  
  5. class=“cn.javass.model.d.ChildModel【对方的Java类名】"/>  
  6.         </set>  
  7. <join table=“tbl_parent_child【联接表】">  
  8.         <key column="cuuid【联接表里代表自己的数据库列名】"/>  
  9.         <many-to-one name="parent" column="puuid【联接表里代表对方的数据库列名】" unique="true【写死】"/>  
  10. </join>  
注解的配置

java代码:
查看复制到剪贴板打印
  1. 1【tbl_parent】:  
  2. @OneToMany(mappedBy="parent【对方的Java类属性名 】")  
  3. private Set<ChildModel> children = new HashSet<ChildModel>();  
  4. 多【tbl_child】:  
  5. @ManyToOne  
  6. @JoinTable(  
  7. name=“tbl_parent_child【联接表】",  
  8. joinColumns=@JoinColumn(name="cuuid【联接表里代表自己的数据库字段名】"),  
  9. inverseJoinColumns=@JoinColumn(name="puuid【联接表里代表对方的数据库字段名】")  
  10. )  
  11. private ParentModel parent;  
 
标准的1:M
 
  
 
 
XML的配置

java代码:
查看复制到剪贴板打印
  1. 1【tbl_product】:  
  2. <join table=“tbl_product_relation【联接表】">  
  3.         <key column=“puuid【联接表里代表自己的列名】"/>  
  4.         <many-to-one name=“course【自己的Java属性名】” column=“cuuid【联接表里代表对方的列名】” unique=“true【写死】"/>  
  5.  </join>  
注解的配置

java代码:
查看复制到剪贴板打印
  1. 1【tbl_product】:  
  2. @ManyToOne  
  3. @JoinTable(  
  4. name=" tbl_product_relation 【联接表】",  
  5. joinColumns=@JoinColumn(name="suuid【联接表里代表自己的列名】"),  
  6. inverseJoinColumns=@JoinColumn(name="cuuid【联接表里代表对方的列名】",unique=true【写死】)  
  7. )  
  8. private CourseModel course;  





HIbernate的annotation注解总结



类图:



代码:

Salesman.java:

[java] view plaincopy
  1. package basicCar.bean;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.   
  6. import javax.persistence.AttributeOverride;  
  7. import javax.persistence.AttributeOverrides;  
  8. import javax.persistence.CascadeType;  
  9. import javax.persistence.Column;  
  10. import javax.persistence.Embedded;  
  11. import javax.persistence.Entity;  
  12. import javax.persistence.GeneratedValue;  
  13. import javax.persistence.Id;  
  14. import javax.persistence.JoinColumn;  
  15. import javax.persistence.JoinTable;  
  16. import javax.persistence.ManyToMany;  
  17. import javax.persistence.OneToMany;  
  18. import javax.persistence.OneToOne;  
  19. import javax.persistence.Table;  
  20. //import org.hibernate.annotations.CascadeType;  
  21. import org.hibernate.annotations.Cache;  
  22. import org.hibernate.annotations.CacheConcurrencyStrategy;  
  23. import org.hibernate.annotations.GenericGenerator;  
  24.   
  25.   
  26. @Entity  
  27. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)    
  28. @Table(name = "salesman")  
  29. public class Salesman implements java.io.Serializable {  
  30.     @Id  
  31.     @GeneratedValue(generator = "mysqlIncrement")  
  32.     @GenericGenerator(name = "mysqlIncrement", strategy = "increment")  
  33.     private long sid;  
  34.     //@Length(min=1,max=3)  
  35.       
  36.     @Column  
  37.     private String salesName;  
  38.       
  39.     @OneToOne(mappedBy="salesman",cascade=CascadeType.ALL)  
  40.     @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)    
  41.     private Alias alias;  
  42.   
  43.       
  44.       
  45.     @OneToMany(mappedBy="salesman",cascade = CascadeType.ALL)//双向一对多  
  46.     @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)    
  47.     private Set<CarOrder> carOrders = new HashSet();  
  48.       
  49.     @ManyToMany(           //双向多对多  
  50.             targetEntity=basicCar.bean.BasicCar.class,  
  51.             cascade = CascadeType.ALL  
  52.             )           
  53.     @JoinTable(  
  54.             name = "carorder",  
  55.             joinColumns = { @JoinColumn(name = "salesId")} ,  
  56.             inverseJoinColumns={@JoinColumn(name="carId")}  
  57.             )  
  58.     @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)    
  59.     private Set<BasicCar> cars = new HashSet();  
  60.   
  61.     @Embedded           //搞定映射组件  
  62.     @AttributeOverrides({  
  63.         @AttributeOverride(name="province", column=@Column(name="province")),  
  64.         @AttributeOverride(name="city", column=@Column(name="city")),  
  65.         @AttributeOverride(name="street", column=@Column(name="street")),  
  66.         @AttributeOverride(name="number", column=@Column(name="number"))  
  67.     })  
  68.     @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)   
  69.     private Address address;  
  70.     /*   
  71.     @Embedded 
  72.     @AttributeOverrides({ 
  73.         @AttributeOverride(name="province", column=@Column(name="wprovince")), 
  74.         @AttributeOverride(name="city", column=@Column(name="wcity")), 
  75.         @AttributeOverride(name="street", column=@Column(name="wstreet")), 
  76.         @AttributeOverride(name="number", column=@Column(name="wnumber")) 
  77.     }) 
  78.     private Address waddress;*/  
  79.       
  80.     public Salesman() {  
  81.     }  
  82.       
  83.     public Salesman(String N) {  
  84.         this.salesName = N;  
  85.     }  
  86.   
  87.     public long getSid() {  
  88.         return this.sid;  
  89.     }  
  90.   
  91.     private void setSid(long sid) {  
  92.         this.sid = sid;  
  93.     }  
  94.   
  95.     public String getSalesname() {  
  96.         return this.salesName;  
  97.     }  
  98.   
  99.     public void setSalesname(String salesName) {  
  100.         this.salesName = salesName;  
  101.     }  
  102.   
  103.     public void setAddress(Address address) {  
  104.         this.address = address;  
  105.     }  
  106.   
  107.     public Address getAddress() {  
  108.         return address;  
  109.     }  
  110.   
  111.     public void setCarOrders(Set<CarOrder> carOrders) {  
  112.         this.carOrders = carOrders;  
  113.     }  
  114.   
  115.     public Set<CarOrder> getCarOrders() {  
  116.         return carOrders;  
  117.     }  
  118.   
  119.     public void setAlias(Alias alias) {  
  120.         this.alias = alias;  
  121.     }  
  122.   
  123.     public Alias getAlias() {  
  124.         return alias;  
  125.     }  
  126.   
  127.     public void setCars(Set<BasicCar> cars) {  
  128.         this.cars = cars;  
  129.     }  
  130.   
  131.     public Set<BasicCar> getCars() {  
  132.         return cars;  
  133.     }  
  134.   
  135.   
  136.   
  137.       
  138.       
  139.     /*public Set<String> getAliases() { 
  140.         return this.aliases; 
  141.         } 
  142.  
  143.         public void setAliases(Set s){ 
  144.         this.aliases=s; 
  145.         }*/  
  146.   
  147.     /*public Address getaddress() { 
  148.         return this.address; 
  149.     } 
  150.  
  151.     public void sethaddress(Address a) { 
  152.         this.address = a; 
  153.     }*/  
  154.     /*   
  155.     public Address getwaddress() { 
  156.         return this.waddress; 
  157.     } 
  158.  
  159.     public void setwaddress(Address a) { 
  160.         this.waddress = a; 
  161.     }*/  
  162. }  

Alias.java:

[java] view plaincopy
  1. package basicCar.bean;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.   
  6. import javax.persistence.CascadeType;  
  7. import javax.persistence.Column;  
  8. import javax.persistence.Entity;  
  9. import javax.persistence.GeneratedValue;  
  10. import javax.persistence.Id;  
  11. import javax.persistence.JoinColumn;  
  12. import javax.persistence.ManyToMany;  
  13. import javax.persistence.OneToOne;  
  14. import javax.persistence.PrimaryKeyJoinColumn;  
  15. import javax.persistence.Table;  
  16. import javax.persistence.Version;  
  17.   
  18. import org.hibernate.annotations.Cache;  
  19. import org.hibernate.annotations.GenericGenerator;  
  20. import org.hibernate.annotations.CacheConcurrencyStrategy;  
  21.   
  22.   
  23. @Entity  
  24. @Table(name = "alias")  
  25. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)    
  26. public class Alias implements java.io.Serializable{  
  27.     /*@Id 
  28.     @GeneratedValue(generator = "mysqlIncrement") 
  29.     @GenericGenerator(name = "mysqlIncrement", strategy = "increment") 
  30.     private long aid;*/  
  31.       
  32.     @Id  
  33.     @GeneratedValue(generator = "mysqlIncrement")  
  34.     @GenericGenerator(name = "mysqlIncrement", strategy = "increment")  
  35.     private long aid;  
  36.       
  37.     @Column  
  38.     private String aliasName;  
  39.       
  40.     @Column  
  41.     private Long amoney;  
  42.       
  43.     @Version  
  44.     @Column(name="version",nullable=false,unique=true)  
  45.     private int version;  
  46.       
  47.     @OneToOne(cascade=CascadeType.ALL)  
  48.     @PrimaryKeyJoinColumn  
  49.     @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)    
  50.     private Salesman salesman;  
  51.       
  52.       
  53.       
  54.     public Alias(){}  
  55.       
  56.   
  57.   
  58.     public void setAliasName(String aliasName) {  
  59.         this.aliasName = aliasName;  
  60.     }  
  61.   
  62.     public String getAliasName() {  
  63.         return aliasName;  
  64.     }  
  65.     public void setSalesman(Salesman salesman) {  
  66.         this.salesman = salesman;  
  67.     }  
  68.     public Salesman getSalesman() {  
  69.         return salesman;  
  70.     }  
  71.   
  72.   
  73.   
  74.     public void setAid(long aid) {  
  75.         this.aid = aid;  
  76.     }  
  77.   
  78.   
  79.   
  80.     public long getAid() {  
  81.         return aid;  
  82.     }  
  83.   
  84.   
  85.   
  86.     public void setVersion(int version) {  
  87.         this.version = version;  
  88.     }  
  89.   
  90.   
  91.   
  92.     public int getVersion() {  
  93.         return version;  
  94.     }  
  95.   
  96.   
  97.   
  98.     public void setAmoney(Long amoney) {  
  99.         this.amoney = amoney;  
  100.     }  
  101.   
  102.   
  103.   
  104.     public Long getAmoney() {  
  105.         return amoney;  
  106.     }  
  107.       
  108.       
  109.   
  110.   
  111. }  

BasicCar.java:

[java] view plaincopy
  1. package basicCar.bean;  
  2.   
  3. import java.util.Date;  
  4. import java.util.HashSet;  
  5. import java.util.Set;  
  6.   
  7. import javax.persistence.Basic;  
  8. import javax.persistence.CascadeType;  
  9. import javax.persistence.Column;  
  10. import javax.persistence.Entity;  
  11. import javax.persistence.FetchType;  
  12. import javax.persistence.GeneratedValue;  
  13. import javax.persistence.Id;  
  14. import javax.persistence.Lob;  
  15. import javax.persistence.ManyToMany;  
  16. import javax.persistence.Table;  
  17. import javax.persistence.Temporal;  
  18. import javax.persistence.TemporalType;  
  19.   
  20. import org.hibernate.annotations.Cache;  
  21. import org.hibernate.annotations.CacheConcurrencyStrategy;  
  22. import org.hibernate.annotations.GenericGenerator;  
  23.   
  24. @Entity  
  25. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)    
  26. @Table(name="basiccar")  
  27. public class BasicCar implements java.io.Serializable {  
  28.     @Id  
  29.     @GeneratedValue(generator="mysqlIncrement")  
  30.     @GenericGenerator(name="mysqlIncrement", strategy="increment")  
  31.     private long id;   
  32.       
  33.     @Column(name = "name")  
  34.     private String name;  
  35.     @Column(name = "factory" , length=50)  
  36.     @Lob  
  37.     private String factory;  
  38.     @Column(name = "date")  
  39.     //@Temporal(TemporalType.TIME)出错Data truncated for column 'date' at row 1  
  40.     @Temporal(TemporalType.DATE)  
  41.     @Basic(fetch=FetchType.LAZY)  
  42.     private Date date;  
  43.   
  44.     @ManyToMany(  
  45.             mappedBy="cars",  
  46.             targetEntity=basicCar.bean.Salesman.class,  
  47.             cascade = {CascadeType.PERSIST,CascadeType.MERGE}  
  48.                 )  
  49.     @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)    
  50.     private Set<Salesman> salesmans = new HashSet();  
  51.       
  52.     public BasicCar() {  
  53.     }  
  54.       
  55.     public BasicCar(String N) {  
  56.         this.name = N;  
  57.     }  
  58.   
  59.     public BasicCar(String name, String factory, Date date) {  
  60.         this.name = name;  
  61.         this.factory = factory;  
  62.         this.date = date;  
  63.     }  
  64.   
  65.     public long getId() {  
  66.         return this.id;  
  67.     }  
  68.   
  69.     public void setId(long id) {  
  70.         this.id = id;  
  71.     }  
  72.   
  73.     public String getName() {  
  74.         return this.name;  
  75.     }  
  76.   
  77.     public void setName(String name) {  
  78.         this.name = name;  
  79.     }  
  80.   
  81.     public String getFactory() {  
  82.         return this.factory;  
  83.     }  
  84.   
  85.     public void setFactory(String factory) {  
  86.         this.factory = factory;  
  87.     }  
  88.   
  89.     public Date getDate() {  
  90.         return this.date;  
  91.     }  
  92.   
  93.     public void setDate(Date date) {  
  94.         this.date = date;  
  95.     }  
  96.       
  97.      public boolean eauals(Object o){  
  98.            
  99.           if(this==o)  
  100.               return true;  
  101.             
  102.           if(!(o instanceof BasicCar))  
  103.               return false;  
  104.             
  105.           final BasicCar other=(BasicCar)o;  
  106.           if(this.getName().equals(other.getName())  
  107.                   &&this.getDate().equals(other.getDate())   
  108.                           &&this.getFactory().equals(other.getFactory()))  
  109.                           return true;  
  110.           else   
  111.               return false;       
  112.       }  
  113.   
  114.     public void setSalesmans(Set<Salesman> salesmans) {  
  115.         this.salesmans = salesmans;  
  116.     }  
  117.   
  118.     public Set<Salesman> getSalesmans() {  
  119.         return salesmans;  
  120.     }  
  121. }  

CarOrder.java:

[java] view plaincopy
  1. package basicCar.bean;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.Entity;  
  5. import javax.persistence.GeneratedValue;  
  6. import javax.persistence.Id;  
  7. import javax.persistence.JoinColumn;  
  8. import javax.persistence.ManyToOne;  
  9. import javax.persistence.Table;  
  10.   
  11. import org.hibernate.annotations.Cache;  
  12. import org.hibernate.annotations.CacheConcurrencyStrategy;  
  13. import org.hibernate.annotations.GenericGenerator;  
  14.   
  15.   
  16. @Entity  
  17. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)   
  18. @Table(name = "carorder1")  
  19. public class CarOrder implements java.io.Serializable {  
  20.     @Id  
  21.     @GeneratedValue(generator = "mysqlIncrement")  
  22.     @GenericGenerator(name = "mysqlIncrement", strategy = "increment")  
  23.     private long cid;  
  24.   
  25.     @Column  
  26.     private String carName;  
  27.   
  28.       
  29.       
  30.     @ManyToOne  
  31.     @JoinColumn(name = "salesId")  
  32.     @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)  
  33.     private Salesman salesman;  
  34.   
  35.     public CarOrder() {  
  36.     }  
  37.   
  38.     public CarOrder(String name) {  
  39.         this.carName = name;  
  40.     }  
  41.   
  42.     public long getCid() {  
  43.         return this.cid;  
  44.     }  
  45.   
  46.     public void setCid(long id) {  
  47.         this.cid = id;  
  48.     }  
  49.   
  50.     public String getcarname() {  
  51.         return this.carName;  
  52.     }  
  53.   
  54.     public void setcarname(String cName) {  
  55.         this.carName = cName;  
  56.     }  
  57.   
  58.     public Salesman getSalesman() {  
  59.         return this.salesman;  
  60.     }  
  61.   
  62.     public void setSalesman(Salesman salesman) {  
  63.         this.salesman = salesman;  
  64.     }  
  65.   
  66.       
  67. }  

Address.java:

[java] view plaincopy
  1. package basicCar.bean;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.Embeddable;  
  5.   
  6. import org.hibernate.annotations.Cache;  
  7. import org.hibernate.annotations.CacheConcurrencyStrategy;  
  8.   
  9. @SuppressWarnings("serial")  
  10. @Embeddable  
  11. public class Address implements java.io.Serializable  {  
  12.     @Column  
  13.     private String province;  
  14.     @Column  
  15.     private String city;  
  16.     @Column  
  17.     private String street;  
  18.     @Column  
  19.     private String number;  
  20.       
  21.     public Address(){}  
  22.       
  23.     public Address(String P,String C,String S,String N)  
  24.     {  
  25.         this.province=P;  
  26.         this.city=C;  
  27.         this.street=S;  
  28.         this.number=N;  
  29.     }  
  30.       
  31.     public void setProvince(String province) {  
  32.         this.province = province;  
  33.     }  
  34.     public String getProvince() {  
  35.         return province;  
  36.     }  
  37.     public void setCity(String city) {  
  38.         this.city = city;  
  39.     }  
  40.     public String getCity() {  
  41.         return city;  
  42.     }  
  43.     public void setStreet(String street) {  
  44.         this.street = street;  
  45.     }  
  46.     public String getStreet() {  
  47.         return street;  
  48.     }  
  49.     public void setNumber(String number) {  
  50.         this.number = number;  
  51.     }  
  52.     public String getNumber() {  
  53.         return number;  
  54.     }  
  55.   
  56. }  

hibernate.hbm.xml:

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC  
  3.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  4.         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5. <hibernate-configuration>  
  6.     <session-factory>  
  7.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
  8.         <property name="hibernate.connection.password">001052</property>  
  9.         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/chwa</property>  
  10.         <property name="hibernate.connection.username">root</property>  
  11.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
  12.           
  13.         <!--设置安全级别-->  
  14.         <property name="hibernate.connection.isolation">2</property>  
  15.           
  16.         <!--  配置EhCache的缓存提供者 -->  
  17.        <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider </property>  
  18.   
  19.        <!--  启动sessionfactory级别的Statistics统计,用于记录持久化操作 -->  
  20.        <property name="hibernate.generate_statistics">true</property>  
  21.          
  22.        <!--   设置二级缓存 -->  
  23.        <property name="hibernate.cache.use_second_level_cache">true</property>  
  24.          
  25.        <!--   查询缓存 -->  
  26.        <property name="hibernate.cache.use_query_cache">true</property>  
  27.          
  28.          
  29.        <!-- 观看查询是输出的sql语句,知道使用和不使用二级缓存的区别-->  
  30.        <property name="hibernate.show_sql">true</property>   
  31.          
  32.         <mapping class="basicCar.bean.Salesman"/>  
  33.          <mapping class="basicCar.bean.CarOrder"/>  
  34.          <mapping class="basicCar.bean.Alias"/>  
  35.          <mapping class="basicCar.bean.BasicCar"/>  
  36.     </session-factory>  
  37. </hibernate-configuration>  

ehcache.xml:

[html] view plaincopy
  1. <ehcache>  
  2.    <diskStore path="C:\\temp"/>  
  3.   
  4.     <defaultCache  
  5.         maxElementsInMemory="10000"  
  6.         eternal="false"  
  7.         timeToIdleSeconds="120"  
  8.         timeToLiveSeconds="120"  
  9.         overflowToDisk="true"  
  10.         />  
  11.   
  12.      <cache name="basicCar.bean.Salesman"  
  13.          maxElementsInMemory="5"  
  14.          eternal="false"  
  15.          timeToIdleSeconds="30"  
  16.          timeToLiveSeconds="30"  
  17.          overflowToDisk="true"  
  18.      />  
  19.     <cache name="basicCar.bean.BasicCar"  
  20.         maxElementsInMemory="5"  
  21.         eternal="false"  
  22.         timeToIdleSeconds="30"  
  23.         timeToLiveSeconds="30"  
  24.         overflowToDisk="true"  
  25.         />  
  26.              
  27.     <cache name="basicCar.bean.CarOrder"  
  28.          maxElementsInMemory="5"  
  29.          eternal="false"  
  30.          timeToIdleSeconds="30"  
  31.          timeToLiveSeconds="30"  
  32.          overflowToDisk="true"  
  33.      />  
  34.        
  35.      <cache name="basicCar.bean.Alias"  
  36.          maxElementsInMemory="5"  
  37.          eternal="false"  
  38.          timeToIdleSeconds="30"  
  39.          timeToLiveSeconds="30"  
  40.          overflowToDisk="true"  
  41.      />  
  42.        
  43.     <cache name="sampleCache2"  
  44.         maxElementsInMemory="1000"  
  45.         eternal="true"  
  46.         timeToIdleSeconds="0"  
  47.         timeToLiveSeconds="0"  
  48.         overflowToDisk="false"  
  49.         />  
  50.   
  51.     <!-- Place configuration for your caches following -->  
  52.       
  53.     <cache name="org.hibernate.cache.StandardQueryCache"  
  54.     maxElementsInMemory="50"  
  55.     eternal="false"  
  56.     timeToIdleSeconds="60"  
  57.     timeToLiveSeconds="60"  
  58.     overflowToDisk="true"  
  59.     />  
  60.     <!--  设置时间戳缓存的数据过期策略 ,保存每个表的最近更新时间-->  
  61.     <!--  查看它的生成时间是不是最后更新时间,如果不是,则证明这个查询缓存已经过期了。  
  62.                     因此只要更新过一个表,涉及这个表的查询缓存就过期了-->  
  63.     <cache name="org.hibernate.cache.UpdateTimestampsCahe"  
  64.         maxElementsInMemory="5000"  
  65.         eternal="true"  
  66.         overflowToDisk="true"  
  67.     />  
  68.   
  69. </ehcache>  

Test.java:

[java] view plaincopy
  1. package basicCar;  
  2.   
  3. import java.sql.Date;  
  4. import java.util.HashSet;  
  5. import java.util.Iterator;  
  6. import java.util.Locale;  
  7. import java.util.ResourceBundle;  
  8. import java.util.Set;  
  9.   
  10. import org.hibernate.Query;  
  11. import org.hibernate.Session;  
  12. import org.hibernate.SessionFactory;  
  13. import org.hibernate.Transaction;  
  14. import org.hibernate.cfg.Configuration;  
  15.   
  16.   
  17. import eventListener.MyLoadListener;  
  18. import eventListener.MyPreInsertListener;  
  19.   
  20.   
  21.   
  22. import basicCar.bean.Address;  
  23. import basicCar.bean.Alias;  
  24. import basicCar.bean.BasicCar;  
  25. import basicCar.bean.Salesman;  
  26. import basicCar.bean.CarOrder;  
  27.   
  28.   
  29. public class Test {  
  30.   
  31.     Configuration cfg;  
  32.   
  33.     SessionFactory sf;  
  34.   
  35.     Session session;  
  36.   
  37.     public static void main(String[] args) {  
  38.         Test test = new Test();  
  39.         test.doConfiguration();  
  40.         test.openSession();  
  41.   
  42.         //test.saveEntity();  
  43.         test.updateEntity();  
  44.         //test.queryEntity3();  
  45.         // test.deleteEntity();  
  46.   
  47.         test.closeSession();  
  48.         System.out.println("end");  
  49.     }  
  50.   
  51.     void doConfiguration() {  
  52.         cfg = new Configuration();    
  53.         //实现监听器  
  54.         /*MyLoadListener mll = new MyLoadListener(); 
  55.         MyPreInsertListener mpl = new MyPreInsertListener(); 
  56.         cfg.setListener("load", mll);*/  
  57.         //cfg.setListener("pre-inset",mpl);  
  58.           
  59.         cfg.configure();  
  60.         sf = cfg.configure().buildSessionFactory();  
  61.   
  62.           
  63.     }  
  64.   
  65.     // open session from session factory  
  66.     void openSession() {  
  67.         session = sf.openSession();  
  68.     }  
  69.   
  70.     // close session  
  71.     void closeSession() {  
  72.         session.close();  
  73.     }  
  74.   
  75.     // save a BasicCar in database  
  76.     void saveEntity() {  
  77.         // begin a transaction to save  
  78.         Transaction tx1 = session.beginTransaction();  
  79.         /* 
  80.          * Salesman sc = new Salesman(); sc.setSalesname("aaa"); CarOrder co = 
  81.          * new CarOrder(); co.setcarname("dd"); co.setSalesman(sc); Set cs = new 
  82.          * HashSet(); cs.add(co); sc.setCarorders(cs); 
  83.          */  
  84.         Salesman sc = new Salesman("hello33");  
  85.           
  86.         Address as = new Address("广东","茂名","鳌头","34号");  
  87.           
  88.         Alias alia = new Alias();  
  89.         alia.setAliasName("dkfjk");  
  90.           
  91.   
  92.         CarOrder co1=new CarOrder();  
  93.         co1.setcarname("aa111");  
  94.         CarOrder co2=new CarOrder();  
  95.         co2.setcarname("aa112");  
  96.   
  97.         Set carorders = new HashSet();  
  98.         carorders.add(co1);  
  99.         carorders.add(co2);  
  100.           
  101.         sc.setAlias(alia);  
  102.         alia.setSalesman(sc);         
  103.           
  104.         co1.setSalesman(sc);  
  105.         co2.setSalesman(sc);  
  106.         sc.setCarOrders(carorders);  
  107.         sc.setAddress(as);  
  108.           
  109.         session.save(sc);  
  110.         session.save(co1);  
  111.         session.save(co2);  
  112.         session.save(alia);  
  113.           
  114.           
  115.         /*Salesman sm1 = new Salesman("xiaox"); 
  116.         Salesman sm2 = new Salesman("xiaox2"); 
  117.         Salesman sm3 = new Salesman("xiaox3"); 
  118.          
  119.         BasicCar bc1 = new BasicCar("BB"); 
  120.         BasicCar bc2 = new BasicCar("BB2"); 
  121.         BasicCar bc3 = new BasicCar("BB3"); 
  122.  
  123.         Set<Salesman> salesmans = new HashSet(); 
  124.         Set<BasicCar> basiccars = new HashSet(); 
  125.          
  126.         salesmans.add(sm1); 
  127.         salesmans.add(sm2); 
  128.         salesmans.add(sm3); 
  129.         basiccars.add(bc1); 
  130.         basiccars.add(bc2); 
  131.         basiccars.add(bc3); 
  132.          
  133.         sm1.setCars(basiccars); 
  134.         bc1.setSalesmans(salesmans); 
  135.          
  136.         session.save(sm1); 
  137.         session.save(sm2); 
  138.         session.save(sm3); 
  139.         session.save(bc1); 
  140.         session.save(bc2); 
  141.         session.save(bc3);*/  
  142.           
  143.   
  144.         tx1.commit();  
  145.     }  
  146.   
  147.     // delete a BasicCar in database  
  148.     /* 
  149.      * void deleteEntity() { // delete the id=1 basicCar Object from database 
  150.      * Transaction tx3 = session.beginTransaction(); try { BasicCar bc4 = 
  151.      * (BasicCar) session.load(BasicCar.class, new Long(1)); 
  152.      * session.delete(bc4); } catch (Exception e) { System.out.println("id=1 car 
  153.      * are not existed, can't be deleted"); } tx3.commit(); } // update a 
  154.      * BasicCar in database void updateEntity() { // update "factory" and "name" 
  155.      * of the id=1 basicCar Object in database Transaction tx2 = 
  156.      * session.beginTransaction(); BasicCar bc2 = (BasicCar) 
  157.      * session.load(BasicCar.class, new Long(1)); bc2.setFactory("ShangHai"); 
  158.      * bc2.setName("SHCar"); session.update(bc2); tx2.commit(); } 
  159.      */  
  160.       
  161. void updateEntity() {  
  162.           
  163.         //测试乐观锁  
  164.         Session session1=sf.openSession();  
  165.         Session session2=sf.openSession();  
  166.           
  167.           
  168.         Transaction tx1 = session1.beginTransaction();  
  169.         Transaction tx2 = session2.beginTransaction();  
  170.           
  171.         try{  
  172.           
  173.             Alias ao1 = (Alias) session1.load(Alias.classnew Long(3));  
  174.             Alias ao2 = (Alias) session2.load(Alias.classnew Long(3));  
  175.         //这时候,两个版本号是相同的  
  176.         ao1.setAmoney(ao1.getAmoney()+10);  
  177.         tx1.commit();         
  178.         //这时候,两个版本号是不相同的  
  179.         ao2.setAmoney(ao2.getAmoney()-10);  
  180.         tx2.commit();  
  181.         System.out.println("OK!");  
  182.         }catch(Exception e){  
  183.             System.out.println(e);  
  184.             if(tx2 != null)//有同步数据库的作用  
  185.             {  
  186.                 tx2.rollback();  
  187.                 //updateEntity2();  
  188.             }  
  189.             else if(tx1 != null)//有同步数据库的作用  
  190.             {  
  191.                 tx1.rollback();  
  192.                 //updateEntity2();  
  193.             }  
  194.               
  195.         }finally{  
  196.             session1.close();  
  197.             session2.close();  
  198.         }  
  199.     }  
  200.       
  201.     void updateEntity2() {  
  202.         //测试乐观锁  
  203.         Session session1=sf.openSession();        
  204.           
  205.         Transaction tx1 = session1.beginTransaction();  
  206.       
  207.         try{          
  208.             Alias ao1 = (Alias) session1.load(Alias.classnew Long(3));  
  209.       
  210.         //重新执行该事务  
  211.         ao1.setAmoney(ao1.getAmoney()+10);  
  212.         tx1.commit();  
  213.         System.out.println("OK2!");  
  214.         }catch(Exception e){  
  215.             //System.out.println(e);  
  216.             if(tx1 != null)//有同步数据库的作用  
  217.             {  
  218.                 tx1.rollback();  
  219.                 updateEntity();  
  220.             }  
  221.               
  222.         }finally{  
  223.             session1.close();  
  224.         }  
  225.           
  226.     }  
  227.   
  228.   
  229.       void queryEntity()   
  230.       {  
  231.           Session session2 = sf.openSession();  
  232.           Query query2 = session2.createQuery("from Salesman");  
  233.        
  234.          java.util.List list2 = query2.list();  
  235.            
  236.          for(int i=0;i<list2.size();i++)  
  237.          {  
  238.              Salesman ac2 = (Salesman)list2.get(i);  
  239.              if((ac2.getCars())!=null)  
  240.              {  
  241.                  Set<BasicCar> s1 = ac2.getCars() ;  
  242.                  if(s1!=null)  
  243.                  {  
  244.                        
  245.                      for(Iterator<BasicCar> it = s1.iterator(); it.hasNext();)  
  246.                      {  
  247.                          String name1 = ac2.getSalesname();  
  248.                         System.out.print(name1+"拥有职务:");  
  249.                         BasicCar r = (BasicCar) it.next() ;  
  250.                         System.out.println("\t【"+r.getName()+"】");  
  251.                      }  
  252.                  }  
  253.                    
  254.              }         
  255.   
  256.          }  
  257.            session2.close();        
  258.       }  
  259.       //queryEntity2和queryEntity3都还要在对类启用二级缓存<cache usage="read-write">  
  260.       void queryEntity2() //对类对象进行缓存  
  261.         {  
  262.               
  263.              Session session1 = sf.openSession();  
  264.               
  265.              try{   
  266.              Query query = session1.createQuery("from Salesman");  
  267.                       
  268.              java.util.List list = query.list();  
  269.                
  270.              for(int i=0;i<list.size();i++)  
  271.              {  
  272.                  Salesman ac1 = (Salesman)list.get(i);  
  273.                    
  274.                  System.out.println("id for the selectedaccout is:"  
  275.                          +ac1.getSalesname());                                 
  276.              }  
  277.              session1.close();  
  278.                
  279.              //第二个session  
  280.              Session session2 = sf.openSession();  
  281.              Salesman ac2 = (Salesman)session2.load(Salesman.classnew Long(6));  
  282.              System.out.println("money for the selectedaccount is:"+ac2.getSalesname());  
  283.              session2.close();  
  284.                                 
  285.               }catch (Exception e) {  
  286.               System.out.println(e);   
  287.               }        
  288.         }  
  289.         
  290.         
  291.         void queryEntity3() //对查询进行缓存  
  292.         {  
  293.               
  294.              Session session1 = sf.openSession();  
  295.               
  296.              try{   
  297.                
  298.              Query query = session1.createQuery("from Salesman where sid > 72");  
  299.               
  300.              //设置使用查询缓存  
  301.              query.setCacheable(true);  
  302.              query.setCacheRegion("basiCar.bean.Salesman");  
  303.                
  304.              java.util.List list = query.list();  
  305.                
  306.              for(int i=0;i<list.size();i++)  
  307.              {  
  308.                  Salesman ac1 = (Salesman)list.get(i);  
  309.                  System.out.println("id for the selectedaccout is:"  
  310.                          +ac1.getSid());                                   
  311.              }  
  312.              session1.close();  
  313.                
  314.              //第二个session  
  315.              Session session2 = sf.openSession();  
  316.              Query query2 = session2.createQuery("from Salesman where sid > 72");  
  317.                
  318.             //设置使用查询缓存  
  319.              query2.setCacheable(true);                     //设置第二个查询是否使用第一个session的缓存  
  320.              query2.setCacheRegion("basiCar.bean.Salesman");//缓存区域不同结果查询重新从数据库导入  
  321.                
  322.              java.util.List list2 = query2.list();  
  323.                
  324.              for(int i=0;i<list2.size();i++)  
  325.              {  
  326.                  Salesman ac2 = (Salesman)list2.get(i);  
  327.                  System.out.println("id for the selectedaccout is:"  
  328.                          +ac2.getSid());                                   
  329.              }  
  330.              session2.close();  
  331.                                 
  332.               }catch (Exception e) {  
  333.               System.out.println(e);   
  334.               }        
  335.         }  
  336.        
  337. }  

数据库图:

                


                                                                    


要导入的包:



最后:还有映射复合主键和继承关系映射没做,需要再补充。





HIbernate注解


(1)
简介:
在过去几年里,Hibernate不断发展,几乎成为Java数据库持久性的事实标准。它非常强大、灵活,而且具备了优异的性能。在本文中,我们将了解如何使用Java 5 注释来简化Hibernate代码,并使持久层的编码过程变得更为轻松。
  传统上,Hibernate的配置依赖于外部 XML 文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载。
    在最近发布的几个Hibernate版本中,出现了一种基于 Java 5 注释的更为巧妙的新方法。借助新的 Hibernate Annotation 库,即可一次性地分配所有旧映射文件——一切都会按照您的想法来定义——注释直接嵌入到您的Java 类中,并提供一种强大及灵活的方法来声明持久性映射。
即利用hibernate注解后,可不用定义持久化类对应的*.hbm.xml文件,直接以注解方式写入在持久化类中来实现。
Hibernate annotation使用了ejb JPA的注解,所以,下面安装配置hibernate annotation环境时,需要导入ejb的包。许多网上的资料都是jpa hibernate annotation方面的资料。
(2)
安装 Hibernate Annotation
第一步,
环境与jar包:
  要使用 Hibernate Annotation,您至少需要具备 Hibernate 3.2和Java 5。可以从 Hibernate 站点下载 Hibernate 3.2 和 Hibernate Annotation库。除了标准的 Hibernate JAR 和依赖项之外,您还需要 Hibernate Annotations .jar 文件(hibernate-annotations.jar)、Java 持久性 API (lib/ejb3-persistence.jar)。
添加hibernate3.2.jar,hibernate-annotations-3.3.0.jar,hibernate-commons-annotations.jar和ejb3-persistence.jar 。这样就可以使用hibernate的annotation了。

如果您正在使用 Maven,只需要向 POM 文件添加相应的依赖项即可,如下所示:
    ...
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate</artifactId>
      <version>3.2.1.ga</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-annotations</artifactId>
      <version>3.2.0.ga</version>
    </dependency>
    <dependency>
      <groupId>javax.persistence</groupId>
      <artifactId>persistence-api</artifactId>
      <version>1.0</version>
    </dependency>
第二步,
获取 Hibernate 会话工厂。尽管无需惊天的修改,但这一工作与使用 Hibernate Annotations有所不同。您需要使用 AnnotationConfiguration 类来建立会话工厂:
sessionFactory = new AnnotationConfiguration().buildSessionFactory(); 
第三步,
尽管通常使用 <mapping> 元素来声明持久性类,您还是需要在 Hibernate 配置文件(通常是 hibernate.cfg.xml)中声明持久性类:
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
        <hibernate-configuration>
          <session-factory>
            <mapping class="com.onjava.modelplanes.domain.PlaneType"/>
            <mapping class="com.onjava.modelplanes.domain.ModelPlane"/>
          </session-factory>
        </hibernate-configuration>
  近期的许多 Java 项目都使用了轻量级的应用框架,例如 Spring。如果您正在使用 Spring 框架,可以使用
AnnotationSessionFactoryBean 类轻松建立一个基于注释的 Hibernate 会话工厂,如下所示:
<!-- Hibernate session factory -->
  <bean id="sessionFactory"
       class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
   <property name="dataSource">
     <ref bean="dataSource"/>
   </property>
   <property name="hibernateProperties">
     <props>
       <prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop>
       <prop key="hibernate.hbm2ddl.auto">create</prop>
       ...
     </props>
   </property>
   <property name="annotatedClasses">
     <list>
       <value>com.onjava.modelplanes.domain.PlaneType</value>
       <value>com.onjava.modelplanes.domain.ModelPlane</value>

       ...
     </list>
   </property>
</bean>
(3)
hibernate Annotation标签的使用:
[1]
1.带注释的持久性类也是普通 POJO,它们只是具备了持久性注释的普通 POJO 。
2.事实上,您既可以保持字段的持久性(注释写在成员变量之上),也可以保持属性(注释写在getter方法之上)的持久性。
3.常用的hibernate annotation标签如下:
@Entity              --注释声明该类为持久类。将一个Javabean类声明为一个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的,要用下面的Transient来注解.

@Table(name="promotion_info")      --持久性映射的表(表名="promotion_info).@Table是类一级的注解,定义在@Entity下,为实体bean映射表,目录和schema的名字,默认为实体bean的类名,不带包名.

@Id--注释可以表明哪种属性是该类中的独特标识符(即相当于数据表的主键)。 
@GeneratedValue   --定义自动增长的主键的生成策略. 
@Transient             --将忽略这些字段和属性,不用持久化到数据库.适用于,在当前的持久类中,某些属性不是用于映射到数据表,而是用于其它的业务逻辑需要,这时,须将这些属性进行transient的注解.否则系统会因映射不到数据表相应字段而出错. 
@Temporal(TemporalType.TIMESTAMP)--声明时间格式 
@Enumerated         --声明枚举 
@Version                --声明添加对乐观锁定的支持 
@OneToOne            --可以建立实体bean之间的一对一的关联 
@OneToMany          --可以建立实体bean之间的一对多的关联 
@ManyToOne          --可以建立实体bean之间的多对一的关联 
@ManyToMany        --可以建立实体bean之间的多对多的关联 
@Formula               --一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等) 
@OrderBy               --Many端某个字段排序(List)
 
1.2
Hibernate 能够出色地自动生成主键。Hibernate/EBJ 3 注释也可以为主键的自动生成提供丰富的支持,允许实现各种策略。
其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法, JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出. 
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO. 
TABLE:使用一个特定的数据库表格来保存主键。 
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 
IDENTITY:主键由数据库自动生成(主要是自动增长型) 
AUTO:主键由程序控制。 
在指定主键时,如果不指定主键生成策略,默认为AUTO。 
@Id
相当于
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
 
identity:
使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)。
Oracle就要采用sequence了.
 
同时,也可采用uuid,native等其它策略.(相关用法,上网查询)
[2]
第一个持久性类 
@Entity 
@Table(name="T_MODEL_PLANE"
public class ModelPlane    implements Serializable { 
        @Id 
        @Column(name="PLANE_ID")    
        @GeneratedValue(strategy=GenerationType.AUTO) //注解于属性中 
/* 
对于oracle想使用各自的Sequence,设置如下:        
@GeneratedValue(strategy = GenerationType.AUTO,generator="PROMOTION_SEQ")        
@SequenceGenerator(name="PROMOTION_SEQ",sequenceName="PROMOTION_SEQ")    
 
另外:
对于自动增长后,在数据表中的相应字段,要设置字段为auto_increment.
*/
 
        private Long id; 

        private String name;//注解写于getter方法之上.请见下. 

     //DATE            - java.sql.Date        
     //TIME            - java.sql.Time        
     //TIMESTAMP - java.sql.Timestamp        
     @Temporal(TemporalType.TIMESTAMP)        
     @Column(name="start_time")        
     private Date startTime;     

     //显示0 隐藏1        
     public static enum DisplayType {显示,隐藏}        
     @Enumerated(value = EnumType.ORDINAL)//ORDINAL序数        
     private DisplayType displayType = DisplayType.显示;    

        //1.sql语句中的字段和表名都应该和数据库相应,而不是类中的字段,        
     //若带有参数如la.id= id,这个=id才是类中属性        
     //2.操作字段一定要用别名        
     @Formula(select COUNT(la.id) from largess la)        
     private int count;    

        //注解于方法中 
        @Column(name="PLANE_ID", length=80, nullable=true//较详细定义 
        public String getName() { 
                return name; 
        } 
        public void setName(String name) { 
                this.name = name; 
        } 
其它的setter,getter省略...... 
}

该内容将映射到下表中: 
CREATE TABLE T_MODEL_PLANE 

        PLANE_ID long
        PLANE_NAME varchar 
        其它字段省略... 
)    
默认情况下,Hibernate 会将持久类以匹配的名称映射到表和字段中。例如,下例中,若不用注解,则会映射到如下一表中:
CREATE TABLE MODELPLANE
(
    ID long,
    NAME varchar
    其它字段省略...
)
[3]
一对多注解:
1.
在一对多注解中,会用到:
"一"方:
@OneToMany --> mappedBy:"多"方的关联属性(被控方)
"多"方:
@ManyToOne --> @JoinColumn,"多"方定义的外键字段.
如数据表定义外键如下:
FOREIGN KEY (classid) REFERENCES classes(id)
则:
@JoinColumn(name="classid"
2.
在双向关联中,有且仅有一端作为主体(owner)端存在:主体端负责维护联接列(即更新),对于不需要维护这种关系的从表则通过mappedNy属性进行声明。mappedBy的值指向另一主体的关联属性。例子中,mappedBy的值为classes。
附加说明:
mappedBy相当于过去的inverse="true".
inverse=false的side(side其实是指inverse=false所位于的class元素)端有责任维护关系,而inverse=true端无须维护这些关系。
3.
cascade与fetch使用说明:
Cascade
CascadeType.PERSIST (级联新建) 
CascadeType.REMOVE  (级联删除) 
CascadeType.REFRESH (级联刷新) 
CascadeType.MERGE   (级联更新)中选择一个或多个。 
CascadeType.ALL
 fetch属性:
关联关系获取方式,即是否采用延时加载。
 LAZY(默认值)采用延时加载,查询数据时,不一起查询关联对象的数据。而是当访问关联对象时(如:getStudnets()时)才触发相应的查询操作,获取关联对象数据。
EAGER:是在查询数据时,也直接一起获取关联对象的数据。
package oneToMany; 
import java.util.Set; 
import javax.persistence.*; 
/* 
注意导入时,是导入:import javax.persistence.*;    
非导入org.hibernate的相关类:import org.hibernate.annotations.Entity; 
*/
 
@Entity 
@Table(name="classes"
public class Classes implements Serializable { 
  @Id 
  @GeneratedValue(strategy=GenerationType.AUTO) 
  private int id; 
  private String name; 
    
  @OneToMany(cascade=CascadeType.ALL,mappedBy="classes")    
  private Set<Student> students; 
//getter,setter省略 



package oneToMany; 
import javax.persistence.*; 
@Entity 
@Table(name="student"
public class Student implements Serializable  { 
  @Id 
  @GeneratedValue(strategy=GenerationType.AUTO) 
  private int sid; 
    
  private String sname; 
    
  //若有多个cascade,可以是:{CascadeType.PERSIST,CascadeType.MERGE} 
  @ManyToOne(cascade={CascadeType.ALL})         
  @JoinColumn(name="classid")     //student类中对应外键的属性:classid 
  private Classes classes; 
//getter,setter省略 



public class TestOneToMany { 
/* 
CREATE TABLE    student (    --要定义外键!!!!!!! 
    `sid` double NOT NULL auto_increment, 
    `classid` double NULL, 
    `sname` varchar(255) NOT NULL, 
    PRIMARY KEY    (sid), 
    INDEX par_ind (classid), 
    FOREIGN KEY (classid) REFERENCES classes(id) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB 
*/
    
  public static void main(String[] args) throws SQLException    
  { 
    try 
    { 
      SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory(); 
      Session session=sf.openSession(); 
      Transaction tx=session.beginTransaction();         
/*
因为mappedBy是定义在classes中,即classes类不负责维护级联关系.即维护者是student.所以,
1.要将clsses的数据,赋给student,即用student的setClasses()方法去捆定class数据;
2.在进行数据插入/更新session.save()/session.update()时,最后操作的是student.
*/
      Classes classes=new Classes(); 
      classes.setName("access"); 
        
      Student st1=new Student(); 
      st1.setSname("jason"); 
      st1.setClasses(classes); 
      session.save(st1); 
        
      Student st2=new Student(); 
      st2.setSname("hwj"); 
      st2.setClasses(classes); 
      session.save(st2); 
      tx.commit();
/* 
输出如下:
Hibernate: insert into classes (name) values (?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
*/
/*
因为一端维护关系另一端不维护关系的原因,我们必须注意避免在应用中用不维护关系的类(class)建立关系,因为这样建立的关系是不会在数据库中存储的。
如上的代码倒过来,则插入时,student的外键值为空.如下:
*/
//      Student st1=new Student(); 
//      st1.setSname("jason"); 

//      session.save(st1); 
//        
//      Student st2=new Student(); 
//      st2.setSname("hwj"); 
//      session.save(st2); 
//        
//      Set<Student> students=new HashSet<Student>(); 
//      students.add(st1); 
//      students.add(st2); 
//        
//      Classes classes=new Classes(); 
//      classes.setName("access"); 
//      classes.setStudents(students); 
//      session.save(classes); 
/*
输出如下:
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into classes (name) values (?)
*/
    } 
    catch(HibernateException e) 
    { 
      e.printStackTrace();        
    } 
  } 
}
 
 
[4]
多对多注解: 
在多对多注解中,双方都采用@ManyToMany.
其中被控方,像一对多注解中设置一样,也要设置mappedBy.
其中主控方,不像一对多注解那样,采用@joinColumn,而是采用@joinTable.如下:
@JoinTable(name="j_student_course" ,joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="cid")})
其中,
如上所说,mappedBy,相当于inverse="true".所以,在@joinTable中的inverseJoinColumns中定义的字段为mappedBy所在类的主键.
joinColumns定义的字段,就是当前类的主键.
@Entity 
@Table(name="jcourse"
public class Jcourse { 
  @Id 
  @GeneratedValue(strategy=GenerationType.AUTO) 
  private int cid; 
  private String cname; 
    
  @ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.LAZY ,mappedBy="courses"
  private Set<Jstudent> students; 
//setter,getter省略....    



@Entity 
@Table(name="jstudent"
public class Jstudent { 
  @Id 
  @GeneratedValue(strategy=GenerationType.AUTO) 
  private int sid; 
    
  private String sname; 
    
  @ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.EAGER) 
  //inverseJoinColumns中对应的id为以下属性course的对应id. 
  @JoinTable(name="j_student_course" ,joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="cid")}) 
  private Set<Jcourse> courses; 
//setter,getter省略....    



public class Test { 
  public static void main(String[] args) { 
    try 
    { 
      SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory(); 
      Session session=sf.openSession(); 
      Transaction tx=session.beginTransaction(); 
        
      Jcourse course=new Jcourse(); 
      course.setCname("jason-english"); 
      session.save(course); //先各自保存. 
        
      Jcourse course2=new Jcourse(); 
      course2.setCname("herry-english"); 
      session.save(course2); 
        
      Set<Jcourse> courses=new HashSet<Jcourse>(); 
      courses.add(course); 
      courses.add(course2); 
        
      Jstudent student=new Jstudent(); 
      student.setSname("jason"); 
      student.setCourses(courses); 
        
      session.save(student);// 要用非mapby定义的类(studet)来作为主者(会控制级联关系),一对多,多对一也一样道理. 
      //可以尝试反过来. 
      tx.commit(); 
    } 
    catch(HibernateException e) 
    { 
      e.printStackTrace();        
    } 
  } 
}

0 0