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:
<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 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<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 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<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 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. <!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 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.     <!-- 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 plain copy
  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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一部分 从Hibernate和EJB 3.0开始  第1章 理解对象/关系持久化    1.1 什么是持久化     1.1.1 关系数据库     1.1.2 理解SQL     1.1.3 在Java中使用SQL     1.1.4 面向对象应用程序中的持久化    1.2 范式不匹配     1.2.1 粒度问题     1.2.2 子类型问题     1.2.3 同一性问题     1.2.4 与关联相关的问题     1.2.5 数据导航的问题     1.2.6 不匹配的代价    1.3 持久层和其他层 显示全部信息第一部分 从Hibernate和EJB 3.0开始  第1章 理解对象/关系持久化    1.1 什么是持久化     1.1.1 关系数据库     1.1.2 理解SQL     1.1.3 在Java中使用SQL     1.1.4 面向对象应用程序中的持久化    1.2 范式不匹配     1.2.1 粒度问题     1.2.2 子类型问题     1.2.3 同一性问题     1.2.4 与关联相关的问题     1.2.5 数据导航的问题     1.2.6 不匹配的代价    1.3 持久层和其他层     1.3.1 分层架构     1.3.2 用SQL/JDBC手工编写持久层     1.3.3 使用序列化     1.3.4 面向对象的数据库系统     1.3.5 其他选项    1.4 ORM     1.4.1 什么是ORM     1.4.2 一般的ORM问题     1.4.3 为什么选择ORM     1.4.4 Hibernate、EJB 3和JPA简介    1.5 小结   第2章 启动项目    2.1 启动Hibernate项目     2.1.1 选择开发过程     2.1.2 建立项目     2.1.3 Hibernate配置和启动     2.1.4 运行和测试应用程序    2.2 启动Java Persistence项目     2.2.1 使用Hibernate Annotations     2.2.2 使用Hibernate EntityManager     2.2.3 引入EJB组件     2.2.4 切换到Hibernate接口    2.3 反向工程遗留数据库     2.3.1 创建数据库配置     2.3.2 定制反向工程     2.3.3 生成Java源代码    2.4 与Java EE服务整合     2.4.1 与JTA整合     2.4.2 JNDI绑定的SessionFactory     2.4.3 JMX服务部署    2.5 小结   第3章 领域模型和元数据    3.1 CaveatEmptor应用程序     3.1.1 分析业务领域     3.1.2 CaveatEmptor领域模型    3.2 实现领域模型     3.2.1 处理关注点渗漏     3.2.2 透明和自动持久化     3.2.3 编写POJO和持久化实体类     3.2.4 实现POJO关联     3.2.5 把逻辑添加到访问方法    3.3 ORM元数据     3.3.1 XML中的元数据     3.3.2 基于注解的元数据     3.3.3 使用XDoclet     3.3.4 处理全局的元数据     3.3.5 运行时操作元数据    3.4 其他实体表示法     3.4.1 创建动态的应用程序     3.4.2 表示XML中的数据    3.5 小结  第二部分 映射概念和策略  第4章 映射持久化类    4.1 理解实体和值类型     4.1.1 细粒度的领域模型     4.1.2 定义概念     4.1.3 识别实体和值类型    4.2 映射带有同一性的实体     4.2.1 理解Java同一性和等同性     4.2.2 处理数据库同一性     4.2.3 数据库主键    4.3 类映射选项     4.3.1 动态的SQL生成     4.3.2 使实体不可变     4.3.3 给查询命名实体     4.3.4 声明包名称     4.3.5 用引号把SQL标识符括起来     4.3.6 实现命名约定    4.4 细粒度的模型和映射     4.4.1 映射基础属性     4.4.2 映射组件    4.5 小结   第5章 继承和定制类型    5.1 映射类继承     5.1.1 每个带有隐式多态的具体类一张表     5.1.2 每个带有联合的具体类一张表     5.1.3 每个类层次结构一张表     5.1.4 每个子类一张表     5.1.5 混合继承策略     5.1.6 选择策略    5.2 Hibernate类型系统     5.2.1 概述实体和值类型     5.2.2 内建的映射类型     5.2.3 使用映射类型    5.3 创建定制的映射类型     5.3.1 考虑定制的映射类型     5.3.2 扩展点     5.3.3 定制映射类型的案例     5.3.4 创建UserType     5.3.5 创建CompositeUserType     5.3.6 参数化定制类型     5.3.7 映射枚举    5.4 小结   第6章 映射集合和实体关联    6.1 值类型的set、bag、list和map     6.1.1 选择集合接口     6.1.2 映射set     6.1.3 映射标识符bag     6.1.4 映射list     6.1.5 映射map     6.1.6 排序集合和有序集合  6.2 组件的集合     6.2.1 编写组件类     6.2.2 映射集合     6.2.3 启用双向导航     6.2.4 避免非空列    6.3 用注解映射集合     6.3.1 基本的集合映射     6.3.2 排序集合和有序集合     6.3.3 映射嵌入式对象的集合    6.4 映射父/子关系     6.4.1 多样性     6.4.2 最简单的可能关联     6.4.3 使关联双向     6.4.4 级联对象状态    6.5 小结   第7章 高级实体关联映射    7.1 单值的实体关联     7.1.1 共享的主键关联     7.1.2 一对一的外键关联     7.1.3 用联结表映射    7.2 多值的实体关联     7.2.1 一对多关联     7.2.2 多对多关联     7.2.3 把列添加到联结表     7.2.4 映射map    7.3 多态关联     7.3.1 多态的多对一关联     7.3.2 多态集合     7.3.3 对联合的多态关联     7.3.4 每个具体类一张多态表    7.4 小结   第8章 遗留数据库和定制SQL    8.1 整合遗留数据库     8.1.1 处理主键     8.1.2 带有公式的任意联结条件     8.1.3 联结任意的表     8.1.4 使用触发器    8.2 定制SQL     8.2.1 编写定制CRUD语句     8.2.2 整合存储过程和函数    8.3 改进Schema DDL     8.3.1 定制SQL名称和数据类型     8.3.2 确保数据一致性     8.3.3 添加领域约束和列约束     8.3.4 表级约束     8.3.5 数据库约束     8.3.6 创建索引     8.3.7 添加辅助的DDL    8.4 小结  第三部分 会话对象处理  第9章 使用对象    9.1 持久化生命周期     9.1.1 对象状态     9.1.2 持久化上下文    9.2 对象同一性和等同性     9.2.1 引入对话     9.2.2 对象同一性的范围     9.2.3 脱管对象的同一性     9.2.4 扩展持久化上下文    9.3 Hibernate接口     9.3.1 保存和加载对象     9.3.2 使用脱管对象     9.3.3 管理持久化上下文    9.4 JPA     9.4.1 保存和加载对象     9.4.2 使用脱管的实体实例    9.5 在EJB组件中使用Java Persistence     9.5.1 注入EntityManager     9.5.2 查找EntityManager     9.5.3 访问EntityManagerFactory    9.6 小结   第10章 事务和并发    10.1 事务本质     10.1.1 数据库和系统事务     10.1.2 Hibernate应用程序中的事务     10.1.3 使用Java Persistence的事务    10.2 控制并发访问     10.2.1 理解数据库级并发     10.2.2 乐观并发控制     10.2.3 获得额外的隔离性保证    10.3 非事务数据访问     10.3.1 揭开自动提交的神秘面纱     10.3.2 使用Hibernate非事务地工作     10.3.3 使用JTA的可选事务    10.4 小结   第11章 实现对话    11.1 传播Hibernate Session     11.1.1 Session传播的用例     11.1.2 通过线程局部传播     11.1.3 利用JTA传播     11.1.4 利用EJB传播    11.2 利用Hibernate的对话     11.2.1 提供对话保证     11.2.2 利用脱管对象的对话     11.2.3 给对话扩展Session    11.3 使用JPA的对话     11.3.1 Java SE中的持久化上下文传播     11.3.2 在对话中合并脱管对象     11.3.3 在Java SE中扩展持久化上下文    11.4 使用EJB 3.0的对话     11.4.1 使用EJB的上下文传播     11.4.2 利用EJB扩展持久化上下文    11.5 小结   第12章 有效修改对象    12.1 传播性持久化     12.1.1 按可到达性持久化     12.1.2 把级联应用到关联     12.1.3 使用传播性状态     12.1.4 利用JPA的传播性关联    12.2 大批量和批量操作     12.2.1 使用HQL和JPA QL的大批量语句     12.2.2 利用批量处理     12.2.3 使用无状态的会话    12.3 数据过滤和拦截     12.3.1 动态数据过滤     12.3.2 拦截Hibernate事件     12.3.3 内核事件系统     12.3.4 实体监听器和回调    12.4 小结   第13章 优化抓取和高速缓存    13.1 定义全局抓取计划     13.1.1 对象获取选项     13.1.2 延迟的默认抓取计划     13.1.3 理解代理     13.1.4 禁用代理生成     13.1.5 关联和集合的即时加载     13.1.6 通过拦截延迟加载    13.2 选择抓取策略     13.2.1 批量预抓取数据     13.2.2 通过子查询预抓取集合     13.2.3 通过联结即时抓取     13.2.4 给二级表优化抓取     13.2.5 优化指导方针    13.3 高速缓存基本原理     13.3.1 高速缓存策略和范围     13.3.2 Hibernate高速缓存架构    13.4 高速缓存实践     13.4.1 选择并发控制策略     13.4.2 理解高速缓存区域     13.4.3 设置本地的高速缓存提供程序     13.4.4 设置重复的高速缓存     13.4.5 控制二级高速缓存    13.5 小结   第14章 利用HQL和JPA QL查询    14.1 创建和运行查询     14.1.1 准备查询     14.1.2 执行查询     14.1.3 使用具名查询    14.2 基本的HQL和JPA QL查询     14.2.1 选择     14.2.2 限制     14.2.3 投影    14.3 联结、报表查询和子查询     14.3.1 联结关系和关联     14.3.2 报表查询     14.3.3 利用子查询    14.4 小结   第15章 高级查询选项    15.1 利用条件和示例查询     15.1.1 基本的条件查询     15.1.2 联结和动态抓取     15.1.3 投影和报表查询     15.1.4 按示例查询    15.2 利用原生的SQL查询     15.2.1 自动的结果集处理     15.2.2 获取标量值     15.2.3 Java Persistence中的原生SQL    15.3 过滤集合    15.4 高速缓存查询结果     15.4.1 启用查询结果高速缓存     15.4.2 理解查询高速缓存     15.4.3 什么时候使用查询高速缓存     15.4.4 自然标识符高速缓存查找    15.5 小结   第16章 创建和测试分层的应用程序    16.1 Web应用程序中的Hibernate     16.1.1 用例简介     16.1.2 编写控制器     16.1.3 OSIV模式     16.1.4 设计巧妙的领域模型    16.2 创建持久层     16.2.1 泛型的数据访问对象模式     16.2.2 实现泛型CRUD接口     16.2.3 实现实体DAO     16.2.4 利用数据访问对象    16.3 命令模式简介     16.3.1 基础接口     16.3.2 执行命令对象     16.3.3 命令模式的变形    16.4 利用EJB 3.0设计应用程序     16.4.1 利用有状态的bean实现会话     16.4.2 利用EJB编写DAO     16.4.3 利用依赖注入    16.5 测试     16.5.1 理解不同种类的测试     16.5.2 TestNG简介     16.5.3 测试持久层     16.5.4 考虑性能基准    16.6 小结   第17章 JBoss Seam简介    17.1 Java EE 5.0编程模型     17.1.1 JSF详解     17.1.2 EJB 3.0详解     17.1.3 用JSF和EJB 3.0编写Web应用程序     17.1.4 分析应用程序    17.2 用Seam改善应用程序     17.2.1 配置Seam     17.2.2 将页面绑定到有状态的Seam组件     17.2.3 分析Seam应用程序    17.3 理解上下文组件     17.3.1 编写登录页面     17.3.2 创建组件     17.3.3 给上下文变量起别名     17.3.4 完成登录/注销特性    17.4 验证用户输入     17.4.1 Hibernate Validator简介     17.4.2 创建注册页面     17.4.3 用Seam实现国际化    17.5 利用Seam简化持久化     17.5.1 实现对话     17.5.2 让Seam管理持久化上下文    17.6 小结  附录A SQL基础知识  附录B 映射快速参考

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值