文档章节

Hibernate Annotation

passionfly
 passionfly
发布于 2015/03/01 14:56
字数 1885
阅读 13
收藏 1

在过去几年里,Hibernate不断发展,几乎成为Java数据库持久性的事实标准。它非常强大、灵活,而且具备了优异的性能。在本文中,我们将了解如何使用Java 5 注释来简化Hibernate代码,并使持久层的编码过程变得更为轻松。
  传统上,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);  


本文转载自:http://fehly.iteye.com/blog/649437

共有 人打赏支持
passionfly
粉丝 14
博文 106
码字总数 76465
作品 0
西安
Hibernate的Annotation

3、Hibernate的Annotation 特别注意:Hibernate的Annotation要依赖于JPA包。 在Hibernate的3.5之前都需要下载Hibernate的Annotation的jar包,在3.5之后Hibernate的Annotation jar包已 经集成...

pmos
2016/10/17
14
0
hibernate学习笔记03-- hibernate + mysql + Annotation

Annotation 的使用主要分为 2 步: 1.1 加入相应的 jar 包: hibernate-annotations.jar // Annotation 核心包 ejb3-persistence.jar // 符合 jpa 标准的 Annotation 的实现 hibernate-comm......

风中海岸
2015/08/30
96
0
Spring 3 MVC and JSR303 @Valid example

In Spring 3, you can enable “mvc:annotation-driven” to support JSR303 bean validation via annotation, if any JSR 303 validator framework on the classpath. Note Hibernate Vali......

凯文加内特
2015/10/10
116
0
框架Hibernate Validator 简介

  用Annotations 给类或者类的属性加上约束(constraint),在运行期检查属性值是很优雅的.Hibernate Validator就是这样的一个框架.该框架是十分容易的(就像参考文档中宣称的那样),几乎没有什...

红薯
2009/02/13
1K
1
Hibernate Annotations

Hibernate Annotations為Hibernate的擴充模組之一,如果您的JDK為5.0以上的版本,即可使用它所提供的Annotation來於.java 檔案上,進行物件與表格的對映定義,在開發上,讓物件屬性的對映設定...

匿名
2009/03/01
3K
0

没有更多内容

加载失败,请刷新页面

加载更多

原型模式

1、原型模式-定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 克隆(浅度克隆->拷贝值类型或者引用,深度克隆->创建新的对象,开辟新的内存) 例如客户端知道抽象Pro...

阿元
今天
10
0
awk命令扩展使用操作

awk 中使用外部shell变量 示例1 [root@centos01 t1022]# A=888[root@centos01 t1022]# echo "" | awk -v GET_A=$A '{print GET_A}'888[root@centos01 t1022]# echo "aaaaaaaaaaaaa" | aw......

野雪球
今天
15
0
深入解析MySQL视图VIEW

Q:什么是视图?视图是干什么用的? A:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。   通过视图,可以展现基表的部分数据;...

IT--小哥
今天
20
0
虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
今天
13
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部