Java EE 之Hibernate初步接触 one-to-many

来源:互联网 发布:索隆 知乎 编辑:程序博客网 时间:2024/05/16 18:53

Hibernate本质上就是对JDBC的封装

 在使用Hibernate的时候,我们需要先书写hibernate.cfg.xml文件,在这个文件中包含了我们所需要连接的数据库的账号密码,以及jdbc驱动名称,以及数据库的url,还有Hibernate相关设置. 这是我写的一个hibernate.cfg.xml文件
 <hibernate-configuration>    <session-factory>        <property name="connection.username">root</property>        <property name="connection.password">root</property>        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="hibernate.connection.url">             <![CDATA[               jdbc:mysql://localhost:3306/hibernate?    useUnicode=true&characterEncoding=utf8             ]]>        </property>        <property name="show_sql">true </property>        <property name="format_sql">true</property>        <property name="hbm2ddl.auto">create</property>        <property name="hibernate.current_session_context_class">thread</property>        <mapping resource="entity/Students.hbm.xml" />        <mapping resource="entity/Classes.hbm.xml" />    </session-factory></hibernate-configuration>   

在配置文件中,前面的4个属性是jdbc相关配置,而show_sql以及format_sql是在Hibernate执行sql语句的时候进行sql格式化输出,hbm2ddl.auto 是在执行sql语句对数据库的操作,当使用create的时候,在sql语句执行之前会重新创建一次表结构,update对表结构进行更新,

hibernate.current_session_context_class属性是当我们获取session的时候可以通过getCurrentSission来获取session

提到了获取session,这里就扩展下获取session的两种方法区别
1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会。

2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭

而mapping-resource是对我们书写的hbm.xml进行加载

下面就是连个bean类,是一个一对多关系的类
第一个教室类

public class Classes implements Serializable {    private int cid;    private String cname;    private String cdesc;    private List<Students> students;    public Classes() {    }    public Classes(String cname, String cdesc, List<Students> students) {        this.cname = cname;        this.cdesc = cdesc;        this.students = students;    }    public int getCid() {        return cid;    }    public void setCid(int cid) {        this.cid = cid;    }    public String getCname() {        return cname;    }    public void setCname(String cname) {        this.cname = cname;    }    public String getCdesc() {        return cdesc;    }    public void setCdesc(String cdesc) {        this.cdesc = cdesc;    }    public List<Students> getStudents() {        return students;    }    public void setStudents(List<Students> students) {        this.students = students;    }}

学生类

public class Students implements Serializable {    private int sid;    private String sname;    private String gender;    public Students() {    }    public Students(String sname, String gender) {        super();        this.sname = sname;        this.gender = gender;    }    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 getGender() {        return gender;    }    public void setGender(String gender) {        this.gender = gender;    }}

对应的hbm.xml文件
classes.hbm.xml

<hibernate-mapping>    <class name="entity.Classes" table="classes">        <id name="cid" >             <generator class="native" />        </id>        <property name="cname" type="java.lang.String"></property>        <property name="cdesc" type="java.lang.String"></property>        <list name="students" table="students">            <key column="cid"></key>            <list-index column="sid" />             <one-to-many class="entity.Students"/>        </list>    </class></hibernate-mapping>

因为在classes类中我们使用的是list对学生的记录,所以在hbm.xml文件中我们用list属性,其中table对应的多的表的名字,key column 指的是在students表中的外键 list index colum对应的是对应的多的表中的主键,one-to-many就是指向多的表的实体类

students.hbm.xml

<hibernate-mapping>    <class name="entity.Students" table="students">        <id name="sid" >             <generator class="native" />        </id>        <property name="sname" type="java.lang.String"></property>        <property name="gender" type="java.lang.String"></property>    </class></hibernate-mapping>
0 0