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

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>

你可能感兴趣的:(java,Hibernate)