Hibernate Annotation笔记
(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();????????
????}
??}
}