-》下载hibernate版本:
hibernate-release-5.4.3.Final.zip
Esclipse开发
添加相应的hibernate库到工程中
具体库如下:该目录下我的全选了,有些是用不到的,懒的一个一个的选,
jpa这个库我跟网上的不一样,怀疑是版本的问题
新建表:
create table grade
(
gid int primary key,
gname varchar(20) not null,
gdesc varchar(64)
);
create table student_info
(
sid int primary key,
sname varchar(20) not null,
sex char(2),
gid int
);
alter table student_info add constraint fk_student_id foreign key(gid)
references grade(gid);
创建Grade类对象
package com.alex.entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class Grade implements Serializable {
private int gid;
private String gname;
private String gdesc;
private Set<Student> students = new HashSet<Student>();
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public String getGdesc() {
return gdesc;
}
public void setGdesc(String gdesc) {
this.gdesc = gdesc;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
public Grade() {
super();
}
public Grade(int gid, String gname, String gdesc, Set<Student> students) {
super();
this.gid = gid;
this.gname = gname;
this.gdesc = gdesc;
this.students = students;
}
public Grade(String gname, String gdesc) {
super();
this.gname = gname;
this.gdesc = gdesc;
}
}
创建student_info类
package com.alex.entity;
import java.io.Serializable;
public class Student implements Serializable {
private int sid;
private String sname;
private String sex;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student() {
super();
}
public Student(String sname, String sex) {
super();
this.sname = sname;
this.sex = sex;
}
}
创建配置文件
文件名称为Grade.hbm.xml
跟数据库要字段要一一对应
<?xml version="1.0"?>
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name = "com.alex.entity.Grade" table ="grade">
<id name = "gid" column ="gid" type="java.lang.Integer">
<generator class ="increment"></generator>
</id>
<property name="gname" type="java.lang.String">
<column name="gname" length="20" not-null="true">
</column>
</property>
<property name = "gdesc" type="java.lang.String">
<column name="gdesc" ></column>
</property>
<set name ="students" table="student">
<key column ="gid"></key>
<!--一对多关联-->
<one-to-many class = "com.alex.entity.Student"></one-to-many>
</set>
</class>
</hibernate-mapping>
配置文件:Student.hbm.xml
<?xml version="1.0"?>
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name = "com.alex.entity.Student" table ="student_info">
<id name = "sid" column ="sid" type="java.lang.Integer">
<generator class ="increment"></generator>
</id>
<property name="sname" type="java.lang.String">
<column name="sname" length="20" not-null="true">
</column>
</property>
<property name = "sex" >
<column name="sex" ></column>
</property>
</class>
</hibernate-mapping>
创建映射文件
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!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>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"> ******</property>
<property name="hibernate.connection.url">
<![CDATA[
jdbc:mysql://192.168.8.xxx/student?useUnicode=true&characterEncoding=utf8
]]>
</property>
<property name="show_sql">true</property> ##是否将sql语句输出到控制台上
<propety name="format_sql">true</property> ##输出到控制台的sql是否要格式化,排版
<property name="hbm2ddl_auto">update</property> ##生成数据库脚本
<property name="hibernate.current_session_context_class">jta</property>
<!--
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.region_prefix">hibernate.test</property>
<property name="hibernate.jdbc.use_streams_for_binary">true</property>
<property name="hibernate.jdbc.batch_size">0</property>
<property name="hibernate.max_fetch_depth">3</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>
<property name="hibernate.generate_statistics">true</property>
<property name="test-assertable-setting">value</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.testing.cache.CachingRegionFactory</property>
<mapping class="org.hibernate.jpa.test.Item"/>
<mapping class="org.hibernate.jpa.test.Cat"/>
<mapping class="org.hibernate.jpa.test.Kitten"/>
<mapping class="org.hibernate.jpa.test.Distributor"/>
<class-cache class="org.hibernate.jpa.test.Item" usage="read-write"/>
<collection-cache collection="org.hibernate.jpa.test.Item.distributors" usage="read-write" region="RegionName"/>
<event type="pre-insert"/>
-->
<!--添加表配置文件的映射-->
<mapping resource = "/hibernate_one2many/src/com/alex/entity/Grade.hbm.xml"></mapping>
<mapping resource = "/hibernate_one2many/src/com/alex/entity/Student.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
构建工厂类
package com.alex.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import com.alex.entity.Grade;
import com.alex.entity.Student;
//工具类
public class hibernateUtil {
private static SessionFactory sessionFactory;
private static Session session;
static
{
Configuration conf = new Configuration().configure();
//unknown entity异常
conf.addClass(Grade.class);
conf.addClass(Student.class);
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
.applySettings(conf.getProperties());
StandardServiceRegistry ssr = ssrb.build();
sessionFactory = conf.buildSessionFactory(ssr);
}
//获取SessionFactory
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static Session getSession(){
session = sessionFactory.openSession();
return session;
}
//关闭session
public static void closesession(Session session){
if(session != null){
session.close();
}
}
}
测试用例
package com.alex.test;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import com.alex.entity.Grade;
import com.alex.entity.Student;
import com.alex.hibernate.hibernateUtil;
public class testDemo {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
add();
}
public static void add(){
Grade grade = new Grade("Java","java development ");
Student stu1 = new Student("Alex","M");
Student stu2 = new Student("Amy","F");
grade.getStudents().add(stu1);
grade.getStudents().add(stu2);
hibernateUtil hibernate = new hibernateUtil();
Session session = hibernate.getSession();
Transaction transaction = session.beginTransaction();
session.save(grade);
session.save(stu1);
session.save(stu2);
transaction.commit();
hibernateUtil.closesession(session);
}
public static void findStudent(){
Session session = hibernateUtil.getSession();
Grade grade = session.get(Grade.class,1);
System.out.println(grade.getGname()+","+grade.getGdesc());
Set<Student> students = grade.getStudents();
for(Student student:students){
System.out.println(student.getSname()+"-->"+student.getSex());
}
}
}
结果:
报错:
unknown entity异常 自己定义的类找不到
解决方案:版本的问题,据说是5.0以上版本需要这么添加
多对一关联
类中添加相应的类
配置修改Student.hbm.xml
<?xml version="1.0"?>
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name = "com.alex.entity.Student" table ="student_info">
<id name = "sid" column ="sid" type="java.lang.Integer">
<generator class ="increment"></generator>
</id>
<property name="sname" type="java.lang.String">
<column name="sname" length="20" not-null="true">
</column>
</property>
<property name = "sex" >
<column name="sex" ></column>
</property>
<many-to-one name= "grade" class="com.alex.entity.Grade" column="gid"></many-to-one>
</class>
</hibernate-mapping>
测试程序
package com.alex.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.alex.entity.Grade;
import com.alex.entity.Student;
import com.alex.hibernate.hibernateUtil;
public class testDemo02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
save();
}
public static void save(){
Grade grade = new Grade("bigdata","bigdata development");
Student st1 = new Student("Kobe","M");
Student st2 = new Student("James","M");
st1.setGrade(grade);
st2.setGrade(grade);
hibernateUtil util = new hibernateUtil();
Session session = hibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
session.save(grade);
session.save(st1);
session.save(st2);
transaction.commit();
util.closesession(session);
}
}
结果:
inverse属性
表示反转,由多方来控制,在单方设置相应属性
openSession和GetCurrentSesssion的区别
1. 使用GetCurrentSession时需要在hdl文件中添加属性,其中thread代表本地事务,jta代表全局事务
2、getCurrentSession关闭事务后自动提交,OpenSession关闭事务后需要手动关闭,否则会连接池溢出
3、openSession每次创建新的session对象 getCurrentSession每次使用现有的session