java

位置:IT落伍者 >> java >> 浏览文章

Hibernate Annotations 实战介绍


发布日期:2020年09月23日
 
Hibernate Annotations 实战介绍
从 hbmxml 到 Annotations

下面让我们先看一个通常用 hbmxml 映射文件的例子个类 HibernateUtiljava 也就是 Hibernate文档中推荐的工具类Personjava Testjava 测试用的类都在testhibernate 包中 每个类的代码如下:

HibernateUtil:

package testhibernate;

import orghibernateHibernateException;

import orghibernateSession;

import orghibernateSessionFactory;

import orghibernatecfgConfiguration;

public class HibernateUtil {

public static final SessionFactory sessionFactory;

static {

try {

sessionFactory = new Configuration()

nfigure()

buildSessionFactory();

} catch (HibernateException e) {

// TODO Autogenerated catch block

eprintStackTrace();

throw new ExceptionInInitializerError(e);

}

}

public static final ThreadLocal<Session> session = new ThreadLocal<Session>();

public static Session currentSession() throws HibernateException {

Session s = sessionget();

if(s == null) {

s = sessionFactoryopenSession();

sessionset(s);

}

return s;

}

public static void closeSession() throws HibernateException {

Session s = sessionget();

if(s != null) {

sclose();

}

sessionset(null);

}

}

Person:

package testhibernate;

import javautilLinkedList;

import javautilList;

/**

*

*/

@SuppressWarnings(serial)

public class Person implements javaioSerializable {

// Fields

private Integer id;

private String name;

private String sex;

private Integer age;

private List list = new LinkedList();

// Collection accessors

public List getList() {

return list;

}

public void setList(List list) {

thislist = list;

}

/** default constructor */

public Person() {

}

/** constructor with id */

public Person(Integer id) {

thisid = id;

}

// Property accessors

public Integer getId() {

return thisid;

}

public void setId(Integer id) {

thisid = id;

}

public String getName() {

return thisname;

}

public void setName(String name) {

thisname = name;

}

public String getSex() {

return thissex;

}

public void setSex(String sex) {

thissex = sex;

}

public Integer getAge() {

return thisage;

}

public void setAge(Integer age) {

thisage = age;

}

}

Test:

/*

* Created on

* @author

*/

package testhibernate;

import javasqlSQLException;

import orghibernateFlushMode;

import orghibernateHibernateException;

import orghibernateSession;

import orghibernateTransaction;

public class Test {

public static void main(String [] args) {

Session s = HibernateUtilcurrentSession();

Transaction tx = sbeginTransaction();

// Person p = (Person) sload(Personclass );

// Systemoutprintln(pgetName());

Person p = new Person();

psetAge();

psetName(icerain);

psetSex(male);

ssave(p);

sflush();

/*

Person p = (Person) sget(Personclass new Integer());

Systemoutprintln(pgetName());

psetName(ice);

ssaveOrUpdate(p);

sflush();

Person p = (Person) sget(Personclass new Integer());

Systemoutprintln(pgetName());

sdelete(p);

*/

mit();

try {

Systemoutprintln(pgetName());

} catch (Exception e) {

// TODO Autogenerated catch block

eprintStackTrace();

}

HibernateUtilcloseSession();

}

}

hibernatecfgxml 配置文件如下利用mysql 数据库

<?xml version= encoding=UTF?>

<hibernateconfiguration>

<sessionfactory>

<property name=nnectiondriver_class>orggjtmmmysqlDriver</property>

<property name=nnectionpassword>你的数据库密码</property>

<property name=nnectionurl>jdbc:mysql://localhost/数据库名</property>

<property name=nnectionusername>用户名</property>

<property name=hibernatedialect>orghibernatedialectMySQLDialect</property>

<property name=show_sql>true</property>

<property name=hibernatetransactionfactory_class>orghibernatetransactionJDBCTransactionFactory</property>

<property name=hibernatetransactionauto_close_session>false</property>

<property name=hibernatehbmddlauto>update</property>

<mapping resource=test/hibernate/annotation/Personhbmxml/>

</sessionfactory>

</hibernateconfiguration>

其中 配置了<property name=hibernatehbmddlauto>update</property>属性 自动导入数据库ddl生产的ddl sql语句如下

create table person (id integer not null auto_increment name varchar() sex varchar() age integer person integer primary key (id))

alter table person add index FKCEBCAC (person) add constraint FKCEBCAC foreign key (person) references person (id)

而Personhbmxml 文件如下:

<?xml version=?>

<hibernatemapping>

<class name=testhibernatePerson table=person>

<id name=id type=integer>

<column name=id />

<generator class=native></generator>

</id>

<property name=name type=string>

<column name=name />

</property>

<property name=sex type=string>

<column name=sex />

</property>

<property name=age type=integer>

<column name=age />

</property>

<bag name=list cascade=all>

<key column=person></key>

<onetomany class=testhibernatePerson/>

</bag>

</class>

</hibernatemapping>

下面让我们看看利用 Hibernate Annotations 如何做只要三个类 不再需要 hbmxml配置文件:

还要把用到的两个jar文件 放入的类路径中 具体如何做请参考 Hibernate Annotations 中文文档

HibernateUtiljava 也就是 Hibernate文档中推荐的工具类Personjava 一个持久化的类 Testjava 测试用的类都在testhibernateannotation 包中 每个类的代码如下:

HibernateUtil

package testhibernateannotation;

import orghibernateHibernateException;

import orghibernateSession;

import orghibernateSessionFactory;

import orghibernatecfgAnnotationConfiguration;

import orghibernatecfgConfiguration;

public class HibernateUtil {

public static final SessionFactory sessionFactory;

static {

try {

sessionFactory = new AnnotationConfiguration() //注意: 建立 SessionFactory于前面的不同

addPackage(testhibernateannotation)

addAnnotatedClass(Personclass)

nfigure()

buildSessionFactory();

//new Configuration(nfigure()buildSessionFactory();

} catch (HibernateException e) {

// TODO Autogenerated catch block

eprintStackTrace();

throw new ExceptionInInitializerError(e);

}

}

public static final ThreadLocal<Session> session = new ThreadLocal<Session>();

public static Session currentSession() throws HibernateException {

Session s = sessionget();

if(s == null) {

s = sessionFactoryopenSession();

sessionset(s);

}

return s;

}

public static void closeSession() throws HibernateException {

Session s = sessionget();

if(s != null) {

sclose();

}

sessionset(null);

}

}

Person:

package testhibernateannotation;

import javautilLinkedList;

import javautilList;

import javaxpersistenceAccessType;

import javaxpersistenceBasic;

import javaxpersistenceEntity;

import javaxpersistenceGeneratorType;

import javaxpersistenceId;

import javaxpersistenceOneToMany;

import javaxpersistenceTable;

import javaxpersistenceTransient;

/**

*

*/

@SuppressWarnings(serial)

@Entity(access = AccessTypePROPERTY) //定义该类为实体类

@Table //映射表

public class Person implements javaioSerializable {

// Fields

private Integer id;

private String name;

private String sex;

private Integer age;

private List list = new LinkedList();

// Constructors

/** default constructor */

public Person() {

}

/** constructor with id */

public Person(Integer id) {

thisid = id;

}

// Property accessors

@Id

public Integer getId() {

return thisid;

}

public void setId(Integer id) {

thisid = id;

}

@Basic

public String getName() {

return thisname;

}

public void setName(String name) {

thisname = name;

}

@Basic

public String getSex() {

return thissex;

}

public void setSex(String sex) {

thissex = sex;

}

@Basic

public Integer getAge() {

return thisage;

}

public void setAge(Integer age) {

thisage = age;

}

@Transient //由于本例不打算演示集合映射 所有声明该属性为 Transient

public List getList() {

return list;

}

public void setList(List list) {

thislist = list;

}

}

注意该实体类中的属性都使用了默认值

Testjava 代码同上

不需要了 hbmxml 映射文件 是不是简单了一些 给人认为简化了一些不是主要目的主要是可以了解一下 EJB 的持久化机制 提高一下开发效率才是重要的

好了 本例就完了 感觉怎么样了 欢迎你来批批

PS:

生成的数据库表 和 程序执行后的 数据库情况如下

mysql> describe person;

+++++++

| Field | Type | Null | Key | Default | Extra |

+++++++

| id | int() | NO | PRI | NULL | auto_increment |

| name | varchar() | YES | | NULL | |

| sex | varchar() | YES | | NULL | |

| age | int() | YES | | NULL | |

| person | int() | YES | MUL | NULL | |

+++++++

rows in set ( sec)

mysql> select * from person;

++++++

| id | name | sex | age | person |

++++++

| | icerain | male | | NULL |

++++++

row in set ( sec)

               

上一篇:技术分享 小结Hibernate的查询方式

下一篇:Hibernate的JNDI名称绑定分析