Hibernate Annotations

来源:互联网 发布:java中集合的由来 编辑:程序博客网 时间:2024/05/04 04:32

     传统上,Hibernate的配置依赖于外部 XML 文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载。
    在最近发布的几个Hibernate版本中,出现了一种基于 Java 5 注释的更为巧妙的新方法。借助新的 Hibernate Annotation 库,即可一次性地分配所有旧映射文件--- 一切都会按照您的想法来定义——注释直接嵌入到您的Java 类中,并提供一种强大及灵活的方法来声明持久性映射。

 

目前,JPA(Java Persistence API)的使用范围越来越广,作为Java EE 5.0平台标准的ORM规范,得到了诸如:Hibernate、TopLink、OpenJpa等ORM框架的支持,同时还是EJB 3.0的重要组成部分。JPA的宗旨是为POJO提供持久化标准规范。它能够脱离容器独立运行,方便开发和测试。本文将通过一个小实例来说明如何在Hibernate中使用JPA,来达到简化编程的目的。

Hibernate Annotations核心注解

Java代码  收藏代码
  1. @Entity 声明当前是一个持久化类  
  2.   
  3. @Table 设置当前持久化类所映射的数据库表,如果当前类中没有使用@Table注解,Hibernate会自动使用默认的持久化类的类名(不带包名)作为所映射的表名  
  4.   
  5. @Id  设置当前持久化类的标示符属性  
  6.   
  7. @GeneratedValue 设置当前标示符的生产策略。@GeneratedValue的name属性设置生成策略的名称是TABLE、INENTITY、SEQUENCE或者AUTO之一。  
  8.   
  9. @Column  将持久化类的数学与数据库表中的字段进行映射,name属性值为映射的字段名,length属性值为字段的长度,unique属性表示该列上设置唯一的约束,nullable属性设置该列的值是否可以为空,precision实现设置该字段的精度,scale属性设置该字段的小数位数  
  10.   
  11. @Transient 标注的属性进行持久化映射  
  12.   
  13. @Temporal java中没有定义时间精度的api,因此处理时间类型数据时,需要设置存储在数据库中所预期的精度,使用@Temporal注释可以调整时间的精度为:DATE、TIME和TIMESTAMP三种  
  14.   
  15. @ManyToOne  设置该当前持久化类类与其他持久化类之间的多对一关联,其中CascadeType值表示Hibernate将进行级联操作  
  16.   
  17. @OneToMany  设置该当前持久化类与其他持久化类之间的一对多关联  
  18.   
  19. @OneToOne   设置该当前持久化类与其他持久化类之间的一对一关联  
  20.   
  21. @ManyToMany 设置该当前持久化类与其他持久化类之间的多对多关联  
  22.   
  23. @NameQueries 在持久化类中设置命名查询,参考@NameQuery的使用  
  24.   
  25. @NameQuery   在持久化类中设置命名查询,@NamedQuery 和@NamedQueries注释加在在类和包上。如下面的例子:  
  26. @NamedQueries({@NamedQuery(name="queryById",query="select p from Product p where id=:id")})  
  27.   
  28. @Version 设置乐观锁定  
  29.   
  30. @Cache 设置二级缓存  
  31.   
  32. @Filters  设置使用过滤器  
  33.   
  34. @FilterDef  声明过滤器  

 

 

 

 

 

 

demo

比如有2个表 一个CATEGORY

Sql代码  收藏代码
  1. -- Create table  
  2. create table CATEGORY  
  3. (  
  4.   ID          NUMBER(8) not null,  
  5.   NAME        NVARCHAR2(200),  
  6.   DESCRIPTION VARCHAR2(1000)  
  7. )  
  8. tablespace USERS  
  9.   pctfree 10  
  10.   initrans 1  
  11.   maxtrans 255  
  12.   storage  
  13.   (  
  14.     initial 64K  
  15.     minextents 1  
  16.     maxextents unlimited  
  17.   );  
  18. -- Create/Recreate primary, unique and foreign key constraints   
  19. alter table CATEGORY  
  20.   add constraint CATEGORY_PK primary key (ID)  
  21.   using index   
  22.   tablespace USERS  
  23.   pctfree 10  
  24.   initrans 2  
  25.   maxtrans 255  
  26.   storage  
  27.   (  
  28.     initial 64K  
  29.     minextents 1  
  30.     maxextents unlimited  
  31.   );  

 

   一个PRODUCT

Sql代码  收藏代码
  1. -- Create table  
  2. create table PRODUCT  
  3. (  
  4.   ID          NUMBER(8) not null,  
  5.   NAME        VARCHAR2(200),  
  6.   PRICE       NUMBER(6,2),  
  7.   DESCRIPTION VARCHAR2(1000),  
  8.   CREATE_TIME DATE,  
  9.   CATEGORY_ID NUMBER(8)  
  10. )  
  11. tablespace USERS  
  12.   pctfree 10  
  13.   initrans 1  
  14.   maxtrans 255  
  15.   storage  
  16.   (  
  17.     initial 64K  
  18.     minextents 1  
  19.     maxextents unlimited  
  20.   );  
  21. -- Create/Recreate primary, unique and foreign key constraints   
  22. alter table PRODUCT  
  23.   add constraint PRODUCT_PK primary key (ID)  
  24.   using index   
  25.   tablespace USERS  
  26.   pctfree 10  
  27.   initrans 2  
  28.   maxtrans 255  
  29.   storage  
  30.   (  
  31.     initial 64K  
  32.     minextents 1  
  33.     maxextents unlimited  
  34.   );  
  35. alter table PRODUCT  
  36.   add constraint PRODUCT_FK foreign key (CATEGORY_ID)  
  37.   references CATEGORY (ID);  

 

 可用MyEclipse 生成对应的持久化类,区别 平时的Hibernate 创建的都是*.hbm.xml而现在是

add  Hibernate mapping annotations to POJO

Category.java

Java代码  收藏代码
  1. import java.util.HashSet;  
  2. import java.util.Set;  
  3. import javax.persistence.CascadeType;  
  4. import javax.persistence.Column;  
  5. import javax.persistence.Entity;  
  6. import javax.persistence.FetchType;  
  7. import javax.persistence.GeneratedValue;  
  8. import javax.persistence.Id;  
  9. import javax.persistence.OneToMany;  
  10. import javax.persistence.Table;  
  11. import org.hibernate.annotations.GenericGenerator;  
  12.   
  13. @Entity  
  14. @Table(name = "CATEGORY", schema = "SCOTT")  
  15. public class Category implements java.io.Serializable {  
  16.   
  17.     private static final long serialVersionUID = 1L;  
  18.     private Long id;  
  19.     private String name;  
  20.     private String description;  
  21.     private Set<Product> products = new HashSet<Product>(0);  
  22.   
  23.     public Category() {  
  24.     }  
  25.   
  26.     // Property accessors  
  27.     @GenericGenerator(name = "generator", strategy = "increment")  
  28.     @Id  
  29.     @GeneratedValue(generator = "generator")  
  30.     @Column(name = "ID", unique = true, nullable = false, precision = 8, scale = 0)  
  31.     public Long getId() {  
  32.         return this.id;  
  33.     }  
  34.   
  35.     public void setId(Long id) {  
  36.         this.id = id;  
  37.     }  
  38.   
  39.     @Column(name = "NAME", length = 400)  
  40.     public String getName() {  
  41.         return this.name;  
  42.     }  
  43.   
  44.     public void setName(String name) {  
  45.         this.name = name;  
  46.     }  
  47.   
  48.     @Column(name = "DESCRIPTION", length = 1000)  
  49.     public String getDescription() {  
  50.         return this.description;  
  51.     }  
  52.   
  53.     public void setDescription(String description) {  
  54.         this.description = description;  
  55.     }  
  56.   
  57.     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "category")  
  58.     public Set<Product> getProducts() {  
  59.         return this.products;  
  60.     }  
  61.   
  62.     public void setProducts(Set<Product> products) {  
  63.         this.products = products;  
  64.     }  
  65.   
  66. }  

 

product.java

Java代码  收藏代码
  1. import java.util.Date;  
  2. import javax.persistence.Column;  
  3. import javax.persistence.Entity;  
  4. import javax.persistence.FetchType;  
  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. import javax.persistence.Temporal;  
  11. import javax.persistence.TemporalType;  
  12. import org.hibernate.annotations.GenericGenerator;  
  13.   
  14. @Entity  
  15. @Table(name = "PRODUCT", schema = "SCOTT")  
  16. public class Product implements java.io.Serializable {  
  17.     private static final long serialVersionUID = 1L;  
  18.     private Long id;  
  19.     private Category category;  
  20.     private String name;  
  21.     private Double price;  
  22.     private String description;  
  23.     private Date createTime;  
  24.   
  25.     public Product() {  
  26.     }  
  27.   
  28.     @GenericGenerator(name = "generator", strategy = "increment")  
  29.     @Id  
  30.     @GeneratedValue(generator = "generator")  
  31.     @Column(name = "ID", unique = true, nullable = false, precision = 8, scale = 0)  
  32.     public Long getId() {  
  33.         return this.id;  
  34.     }  
  35.   
  36.     public void setId(Long id) {  
  37.         this.id = id;  
  38.     }  
  39.   
  40.     @ManyToOne(fetch = FetchType.LAZY)  
  41.     @JoinColumn(name = "CATEGORY_ID")  
  42.     public Category getCategory() {  
  43.         return this.category;  
  44.     }  
  45.   
  46.     public void setCategory(Category category) {  
  47.         this.category = category;  
  48.     }  
  49.   
  50.     @Column(name = "NAME", length = 200)  
  51.     public String getName() {  
  52.         return this.name;  
  53.     }  
  54.   
  55.     public void setName(String name) {  
  56.         this.name = name;  
  57.     }  
  58.   
  59.     @Column(name = "PRICE", precision = 6)  
  60.     public Double getPrice() {  
  61.         return this.price;  
  62.     }  
  63.   
  64.     public void setPrice(Double price) {  
  65.         this.price = price;  
  66.     }  
  67.   
  68.     @Column(name = "DESCRIPTION", length = 1000)  
  69.     public String getDescription() {  
  70.         return this.description;  
  71.     }  
  72.   
  73.     public void setDescription(String description) {  
  74.         this.description = description;  
  75.     }  
  76.   
  77.     @Temporal(TemporalType.DATE)  
  78.     @Column(name = "CREATE_TIME", length = 7)  
  79.     public Date getCreateTime() {  
  80.         return this.createTime;  
  81.     }  
  82.   
  83.     public void setCreateTime(Date createTime) {  
  84.         this.createTime = createTime;  
  85.     }  
  86.   
  87. }  

 

Java代码  收藏代码
  1. import org.hibernate.Session;  
  2. import org.hibernate.SessionFactory;  
  3. import org.hibernate.Transaction;  
  4. import org.hibernate.cfg.AnnotationConfiguration;  
  5.   
  6. public class HibernateAnnotationsTest {  
  7.     public void testAnnotations() {  
  8.         SessionFactory sessionFactory = new AnnotationConfiguration().configure()  
  9.                 .buildSessionFactory();  
  10.         Session session = sessionFactory.getCurrentSession();  
  11.   
  12.         Category category = new Category();  
  13.         category.setName("demo");  
  14.         category.setDescription("这是一个例子");  
  15.   
  16.         Product product = new Product();  
  17.         product.setName("妮维雅");  
  18.         product.setPrice(new Double(46.0));  
  19.         product.setDescription("护肤品");  
  20.   
  21.         product.setCategory(category);  
  22.         category.getProducts().add(product);  
  23.   
  24.         Transaction tx = session.beginTransaction();  
  25.         session.save(category);  
  26.         session.save(product);  
  27.         tx.commit();  
  28.         sessionFactory.close();  
  29.     }  
  30.   
  31.     public static void main(String[] args) {  
  32.         HibernateAnnotationsTest test = new HibernateAnnotationsTest();  
  33.         test.testAnnotations();  
  34.     }  
  35. }  

 

注意: 回报这种错误 java.lang.NoSuchMethodError: org.hibernate.event.PreInsertEvent.getSource()Lorg/hibernate/engine/SessionImplementor;

解决方法 替换hibernate-annotation.jar 和hibernate-validator.jar  换成新点的 或者你把hibernate-validator.jar  移除也行

hibernate-annotation.jar 换成3.4.0的就好了,3.5.1-Final还会报一个缺少MetadataProvider的类具体没太注意解决的方法,validator我换的是4.0.2的其他的没测试应该也没什么问题...

 

@GeneratedValue注解生成策略

TABLE 借助数据库表,生成存标识符属性值,表中保存当前的标识符属性的最大值

IDENTITY  使用数据库表中的自动增长字段生成标识符属性值

SEQUENCE  使用数据库的序列生成标识符属性值

AUTO  可以是上面三种任意一种类型,取决于底层数据库的类型

 

Hibernate EntityManager

java Persistence API(JPA)
java persistence api 是ejb3.0规范之一,定义了对数据库数据进行持久化操作的接口,Hibernate使用 Hibernate annotations和Hibernate EntityManager实现了JPA

会使用到 Hibernate-EntityManager.jar和jboss-archive-browing.jar

 

和Annotation不同的是没有用到hibernate.cfg.xml 而是使用persistence.xml文件的实现填写信息而xml文件必须在META-INF文件夹下其余的基本相同

persistence.xml

Xml代码  收藏代码
  1. <?xml version='1.0' encoding='UTF-8'?>  
  2. <persistence xmlns="http://java.sun.com/xml/ns/persistence"  
  3.     xmlns:xsi="http://www.23.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/ns/persistence http://java.sun.com/ns/persistence/persistence_1_0.xsd"  
  5.     version="1.0">  
  6.     <persistence-unit name="entityManagerTest">  
  7.         <provider>org.hibernate.ejb.HibernatePersistence  
  8.         </provider>  
  9.         <properties>  
  10.             <property name="hibernate.archive.autodetection" value="class, hbm" />  
  11.             <property name="hibernate.show_sql" value="true" />  
  12.             <property name="hibernate.format_sql" value="true" />  
  13.             <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />  
  14.             <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" />  
  15.             <property name="hibernate.connection.url" value="jdbc:oracle:thin:@localhost:1521:dbrbh" />  
  16.             <property name="hibernate.connection.username" value="scott" />  
  17.             <property name="hibernate.connection.password" value="tiger" />             
  18.         </properties>  
  19.     </persistence-unit>  
  20. </persistence>  

 

 

Java代码  收藏代码
  1. //EntityManagerFactory==SessionFactory  
  2.     EntityManagerFactory emf = Persistence.createEntityManagerFactory("entityManagerTest");  
  3.     //EntityManager == session  
  4.     EntityManager entityManager = emf.createEntityManager();  
  5.     //EntityTransaction == Transaction  
  6.     EntityTransaction tx = entityManager.getTransaction();  
  7. //entityManager persist()=Session.save()  
  8.     entityManager.persist(category);  
原创粉丝点击