Hibernate4实战之注解版

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:
"uuid">
"assigned"/>
       
@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
   Hibernate4实战之注解版_第1张图片 
XML的配置

java代码:
查看 复制到剪贴板 打印
  1. 1【tbl_product】:  
  2. "info" cascade="all"/>  
  3. 1【tbl_product_info】:  
  4. "uuid">  
  5. class=“foreign【写死,使用外来生成策略】">  
  6. product【引用自己的Java属性名】   
  7.   
  8.   
  9. "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.  "children">  
  3.           
  4.         class=“cn.javass.model.c.ChildModel【对方的Java类名】"/>  
  5.     
  6. 多【tbl_child】:  
  7.   
注解的配置


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

 
XML的配置

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

   Hibernate4实战之注解版_第2张图片 
XML的配置


java代码:
查看 复制到剪贴板 打印
  1. 1【tbl_product】:  
  2. " cascade="all"/>  
  3. 1【tbl_product_info】:  
  4. 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.   
  3.           
  4.         true【写死】”  
  5. class=“cn.javass.model.d.ChildModel【对方的Java类名】"/>  
  6.           
  7.   
  8.         "cuuid【联接表里代表自己的数据库列名】"/>  
  9.         "parent" column="puuid【联接表里代表对方的数据库列名】" unique="true【写死】"/>  
  10.   
注解的配置

java代码:
查看 复制到剪贴板 打印
  1. 1【tbl_parent】:  
  2. @OneToMany(mappedBy="parent【对方的Java类属性名 】")  
  3. private Set children = new HashSet();  
  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.   
  3.           
  4.         true【写死】"/>  
  5.    
注解的配置

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 plain copy
  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 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 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 carOrders) {  
  112.         this.carOrders = carOrders;  
  113.     }  
  114.   
  115.     public Set 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 cars) {  
  128.         this.cars = cars;  
  129.     }  
  130.   
  131.     public Set getCars() {  
  132.         return cars;  
  133.     }  
  134.   
  135.   
  136.   
  137.       
  138.       
  139.     /*public Set 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 plain copy
  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 plain copy
  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 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 salesmans) {  
  115.         this.salesmans = salesmans;  
  116.     }  
  117.   
  118.     public Set getSalesmans() {  
  119.         return salesmans;  
  120.     }  
  121. }  

CarOrder.java:

[java]  view plain copy
  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 plain copy
  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 plain copy
  1. xml version="1.0" encoding="UTF-8"?>  
  2.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  3.         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  4. <hibernate-configuration>  
  5.     <session-factory>  
  6.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driverproperty>  
  7.         <property name="hibernate.connection.password">001052property>  
  8.         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/chwaproperty>  
  9.         <property name="hibernate.connection.username">rootproperty>  
  10.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialectproperty>  
  11.           
  12.           
  13.         <property name="hibernate.connection.isolation">2property>  
  14.           
  15.           
  16.        <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider property>  
  17.   
  18.          
  19.        <property name="hibernate.generate_statistics">trueproperty>  
  20.          
  21.          
  22.        <property name="hibernate.cache.use_second_level_cache">trueproperty>  
  23.          
  24.          
  25.        <property name="hibernate.cache.use_query_cache">trueproperty>  
  26.          
  27.          
  28.          
  29.        <property name="hibernate.show_sql">trueproperty>   
  30.          
  31.         <mapping class="basicCar.bean.Salesman"/>  
  32.          <mapping class="basicCar.bean.CarOrder"/>  
  33.          <mapping class="basicCar.bean.Alias"/>  
  34.          <mapping class="basicCar.bean.BasicCar"/>  
  35.     session-factory>  
  36. hibernate-configuration>  

ehcache.xml:

[html]  view plain copy
  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.       
  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.     
             class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
      
        
      

      
        
           org.hibernate.dialect.DerbyDialect
           create
           ...
        

      
      
        
           com.onjava.modelplanes.domain.PlaneType
           com.onjava.modelplanes.domain.ModelPlane

           ...
        
      
(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 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 students=new HashSet(); 
//      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 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 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 courses= new HashSet(); 
      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();        
    } 
  } 
}

你可能感兴趣的:(Hibernate)