首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

hibernate Annotation种的操作

2012-08-25 
hibernate Annotation类的操作简介:在过去几年里,Hibernate不断发展,几乎成为Java数据库持久性的事实标准。

hibernate Annotation类的操作

简介:
在过去几年里,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();????????
???? }
?? }
}

?

热点排行