简单使用Hibernate,只需在pom.xml中引入:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hurricane</groupId>
<artifactId>hibernate</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hibernate</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.1.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
</dependencies>
</project>
从pom.xml中可见,与Hibernate相关的只有hibernate-core,在maven将它的依赖加入后,hibernate需要的jar包有:
1.hibernate-core-5.2.1.Final.jar
2.jboss-logging-3.3.0.Final.jar
3.hibernate-jpa-2.1-api-1.0.0.Final.jar
4.javassist-3.20.0-GA.jar
5.antlr-2.7.7.jar
6.geronimo-jta_1.1_spec-1.1.1.jar
7.jandex-2.0.0.Final.jar
8.classmate-1.3.0.jar
9.dom4j-1.6.1.jar
10.hibernate-commons-annotations-5.0.1.Final.jar
11.cdi-api-1.1-PFD.jar
12.el-api-2.2.jar
13.jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar
14.jsr250-api-1.0.jar
15.javax.inject-1.jar
引入jar包之后,在classpath下创建一个hibernate.cfg.xml(文件头可以在hibernate-core-xxx.jar中的hibernate-configuration-3.0.dtd中找到)文件,例如:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf8</property>
<property name="connection.username">root</property>
<property name="connection.password">121909</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="com/hurricane/hibernate/domain/Event.hbm.xml" />
<mapping resource="com/hurricane/hibernate/domain/Person.hbm.xml" />
<mapping class="com.hurricane.hibernate.domain.Student"/>
<mapping class="com.hurricane.hibernate.domain.Teacher"/>
</session-factory>
</hibernate-configuration>
然后创建自己的实体类,并通过xml或annotation来配置实体类到数据库表的映射关系,当然实体类间如果存在关联,那么实体类间的关联关系也是要配置的。
实体类的xml配置文件要在与实体类同包下,命名规则为: 实体类名.hbm.xml, 如下是Person.hbm.xml(文件头可以在hibernate-core-xxx.jar中的hibernate-mapping-3.0.dtd中找到)文件的配置:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hurricane.hibernate.domain">
<class name="Person" table="PERSON">
<id name="id" column="PERSON_ID">
<generator class="native" />
</id>
<property name="age" />
<property name="firstName" />
<property name="lastName" />
<set name="events" table="PERSON_EVENT" cascade="save-update" inverse="false">
<key column="PERSON_ID" />
<many-to-many column="EVENT_ID" class="Event" />
</set>
<set name="emails" table="PERSON_EMAIL" cascade="save-update">
<key column="PERSON_ID" />
<element type="string" column="EMAIL_ADDR" />
</set>
</class>
</hibernate-mapping>
测试代码:
/**
* 测试inverse=false的一方存储带来的效果,结果显示在插入自己时将关联对象也插入了进去,并向中间表插入了数据
* 注意:若是执行save但是之前没有beginTransaction会报错,提示保存操作必须在事务中执行
* 若是只beginTransaction但是不commit会使得中间表无法插入数据
*/
@Test
public void testM2MBasic() {
Person person = new Person();
person.setFirstName("hurricane2");
person.setLastName("tornado2");
Set<String> emails = new HashSet<String>();
emails.add("aaa@aaa.com");
emails.add("bbb@bbb.com");
person.setEmails(emails);
Event event = new Event();
event.setTitle("event1");
event.setDate(new Date());
Event event2 = new Event();
event2.setTitle("event2");
event2.setDate(new Date());
// person.addToEvent(event); //这种方式可以使得双方都可以维护关联关系,不过两方都需要配置cascade="save-update"
// person.addToEvent(event2); //这种方式需要的时候,记起来就可以了
Set<Event> events = new HashSet<Event>();
events.add(event);
events.add(event2);
person.setEvents(events);
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(person);
session.getTransaction().commit(); //可以注释掉这一行来查看效果
session.close();
sessionFactory.close();
}
至此,基本的使用就可以做到了。
参考资料:
1. hibernate主要文档:hibernate-distribution-3.6.10.Final/documentation/manual/zh-CN/html_single/index.html
2.hibernate注解相关:hibernate-annotations-3.4.0.GA/doc/reference/zh_cn/html_single/index.html
3.hibernate API:hibernate-distribution-3.6.10.Final/documentation/javadocs/index.html