Hibernate 基于mysql开发

-》下载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

 



 

 


    
  

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值