读书人

[转] Hibernate Annotation札记

发布时间: 2012-07-01 13:15:00 作者: rapoo

[转] Hibernate Annotation笔记

转自:?http://shenzhenchufa.blog.51cto.com/730213/291787

?

(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 ,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();????????
????}?
??}?
}

读书人网 >开源软件

热点推荐