Hibernate中的各种关系映射与配置

来源:互联网 发布:常见数据库系统 编辑:程序博客网 时间:2024/06/06 03:11

组合主键映射

组合主键映射

ScoreId.java

public class ScoreId implements Serializable{

private int stuId;//学生编号

private int subjectId;//科目编号

    //省略getter setter

}

Score.java //在主类中引用对应组件

public class Score {

private ScoreId scoreId;

private double result;//成绩

//省略 getter setter

}

映射文件的编写

<hibernate-mapping package="cn.siggy.pojo">

<class name="Score">

<composite-id name="scoreId" class="ScoreId">

<key-property name="stuId"></key-property>

<key-property name="subjectId"></key-property>

</composite-id>

<property name="result"/>

</class>

</hibernate-mapping>

          session = HibernateUtil.getSession();

tx = session.beginTransaction();

Score s = new Score();

ScoreId sid = new ScoreId();

sid.setStuId(2);

sid.setSubjectId(6);

s.setResult(89);

s.setScoreId(sid);

session.save(s);

tx.commit();

 

 

 

 

大对象映射

大对象映射

public class Student {    //Student.java

private int id;

private String name;

private int age;

//存放大数据  可以存放4G的内容

private Blob image;

private Clob introduce;

    //省略get/set

}

<hibernate-mapping package="cn.siggy.pojo">

<class name="Student">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

<property name="age"/>

<property name="image" type="java.sql.Blob"/>

<property name="introduce" type="java.sql.Clob"/>

</class>

</hibernate-mapping>

          session = HibernateUtil.getSession();

tx = session.beginTransaction();

Student stu = new Student();

stu.setName("尹志平");

stu.setAge(23);

Blob blob = new SerialBlob("ttt".getBytes());

Clob clob = new SerialClob("sss".toCharArray());

stu.setImage(blob);

stu.setIntroduce(clob);

session.save(stu);

tx.commit();

 

 

 

 

 

 

 

 

 

单向多对一关联映射

单向多对一的关联映射

public class Student {

private int id;

private String name;

private int age;

private Grade grade;

//get…set

}

public class Grade {

private int id;

private String name;

//get…set

}

 

<hibernate-mapping package="cn.siggy.pojo"><!--Grade.hbm.xml-->

<class name="Grade">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

</class>

</hibernate-mapping>

<!--Student.hbm.xml-->

<hibernate-mapping package="cn.siggy.pojo">

<class name="Student">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

<property name="age"/>

<!-- 多对一  name表示属性名  class指明 属性对应的类

 column指 数据库表中的列名-->

<many-to-one name="grade" class="Grade" 

column="grade_id" foreign-key="fk_grade" not-null="true"/>

</class>

</hibernate-mapping>

 

 

单向一对多关联映射

单向一对多的关联映射

public class Student {

private int id;

private String name;

private int age;

//get…set

}

public class Grade {

private int id;

private String name;

private Set<Student>students = new HashSet<Student>(0); //get…set

}

<hibernate-mapping package="cn.siggy.pojo">

<class name="Grade">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

<!-- setGrade中的集合属性  name属性名称-->

<set name="students">

<!-- key表示外键  column外键列名-->

<key column="grade_id" not-null="true"></key>

<!-- one-to-many 一对多  类Grade 中  students所表示类型 -->

<one-to-many class="Student"/>

</set>

</class>

</hibernate-mapping>

<hibernate-mapping package="cn.siggy.pojo">

<class name="Student">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

<property name="age"/>

   </class>

</hibernate-mapping>

 

 

 

 

双向一对多关联映射

双向一对多的关联映射

public class Student {

private int id;

private String name;

private int age;

private Grade grade;

    //get…set

}

public class Grade {

private int id;

private String name;

private Set<Student>students = new HashSet<Student>(0); //get…set

}

<hibernate-mapping package="cn.siggy.pojo">

<class name="Grade">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

<!-- setGrade中的集合属性  name属性名称-->

<set name="students">

<!-- key表示外键  column外键列名-->

<key column="grade_id"></key>

<!-- one-to-many 一对多  类Grade 中  students所表示类型 -->

<one-to-many class="Student"/>

</set>

</class>

</hibernate-mapping>

<hibernate-mapping package="cn.siggy.pojo">

<class name="Student">

<id name="id">

<generator class="native"></generator></id>

<property name="name"/>

<property name="age"/>

<many-to-one name="grade" class="Grade" column="grade_id" not-null="true"></many-to-one>

</class>

</hibernate-mapping>

 

 

基于外键单向一对一的关联映射

public class Person {

private int id;

private String name;

private int age;

private IdCard idCard;

//get…set

}

public class IdCard{

private int id;

private String code;

//get…set

}

 

<hibernate-mapping package="cn.siggy.pojo">

<class name="Person">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

<property name="age"/>

<!-- unique="true"时候 可以设置一对一的关系-->

<many-to-one name="idCard" class="IdCard" cascade="save-update"

column="idcard_id" foreign-key="fk_idcard" not-null="true"

unique="true"/>

</class>

</hibernate-mapping>

<hibernate-mapping package="cn.siggy.pojo">

<class name="IdCard">

<id name="id">

<generator class="native"></generator>

</id>

<property name="code"/>

</class>

</hibernate-mapping>

 

 

 

 

 

 

 

基于外键双向一对一关联映射

public class IdCard {

private int id;

private String code;

private Person person;

    //get  --- set

}

public class Person {

private int id;

private String name;

private int age;

private IdCard idCard;

    //get  --- set

}

<hibernate-mapping package="cn.siggy.pojo">

<class name="IdCard">

<id name="id">

<generator class="native"></generator>

</id>

<property name="code"/>

<one-to-one name="person" property-ref="idCard"/>

</class>

</hibernate-mapping>

<hibernate-mapping package="cn.siggy.pojo">

<class name="Person">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

<property name="age"/>

<!--

unique="true"时候 可以设置一对一的关系

 -->

<many-to-one name="idCard" class="IdCard" cascade="save-update"

column="idcard_id" foreign-key="fk_idcard" not-null="true"

unique="true"/>

</class>

</hibernate-mapping>

 

 

 

 

基于主键的单向一对一的关联映射

public class Person {

private int id;

private String name;

private int age;

private IdCard idCard;

//get…set

}

public class IdCard{

private int id;

private String code;

//get…set

}

 

<hibernate-mapping package="cn.siggy.pojo">

<class name="Grade">

<id name="id">

<generator class="native"></generator>

</id>

<property name="code"/>

</class>

</hibernate-mapping>

<hibernate-mapping package="cn.siggy.pojo">

<class name="Person">

<id name="id">

<!-- foreign表示引用外键-->

<generator class="foreign">

<!-- 引用idCard属性所对应的主键-->

<param name="property">idCard</param>

</generator>

</id>

<property name="name"/>

<property name="age"/>

<!-- 一对一 -->

<one-to-one name="idCard" constrained="true" cascade="save-update"/>

</class>

</hibernate-mapping>

 

 

 

 

基于主键的双向一对一的关联映射

public class Person {

private int id;

private String name;

private int age;

private IdCard idCard;

//get   --set

}

public class IdCard {

private int id;

private String code;

private Person person;

//get   --set

}

<hibernate-mapping package="cn.siggy.pojo">

<class name="Person">

<id name="id">

<!-- foreign表示引用外键 -->

<generator class="foreign">

<!-- 引用idCard属性所对应的主键-->

<param name="property">idCard</param>

</generator>

</id>

<property name="name"/>

<property name="age"/>

<!-- 一对一 -->

<one-to-one name="idCard" constrained="true" cascade="save-update"/>

</class>

</hibernate-mapping>

<hibernate-mapping package="cn.siggy.pojo">

<class name="IdCard">

<id name="id">

<generator class="native"></generator>

</id>

<property name="code"/>

<one-to-one name="person"/>

</class>

</hibernate-mapping>

 

 

 

 

基于主键的单向多对多的关联映射

public class Role {

private int id;

private String name;

private Set<Function>functions = new HashSet<Function>(0);

//get…set

}

public class Function {

private int id;

private String name;

private String code;

private String url;

//get…set }

 

<hibernate-mapping package="cn.siggy.pojo">

<class name="Role">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

<!-- 多对多 -->

<set name="functions" table="role_func" cascade="save-update">

<!-- 表示当前类 映射到关系表中的列-->

<key column="rid"/>

<!-- 所对应的另一方在关系表中的列-->

<many-to-many column="fid" class="Function"/>

</set>

</class>

</hibernate-mapping>

<hibernate-mapping package="cn.siggy.pojo">

<class name="Function">

<id name="id">

<!-- foreign表示引用外键-->

<generator class="native"/>

</id>

<property name="name"/>

<property name="code"/>

<property name="url"/>

</class>

</hibernate-mapping>

 

 

基于主键的双向多对多的关联映射

public class Role {

private int id;

private String name;

private Set<Function>functions = new HashSet<Function>(0);

//get…set

}

public class Function {

private int id;

private String name;

private String code;

private String url;

private Set<Role> roles = new HashSet<Role>(0);

//get…set }

 

<hibernate-mapping package="cn.siggy.pojo">

<class name="Role">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

<!-- 多对多 -->

<set name="functions" table="role_func" cascade="save-update">

<!-- 表示当前类 映射到关系表中的列-->

<key column="rid"/>

<!-- 所对应的另一方在关系表中的列-->

<many-to-many column="fid" class="Function"/>

</set>

</class>

</hibernate-mapping>

<hibernate-mapping package="cn.siggy.pojo">

<class name="Function">

<id name="id"><generator class="native"/></id>

<property name="name"/>

<property name="code"/><property name="url"/>

       <set name="roles" table="role_func" inverse="true">

<key column="fid"/>

<many-to-many column="rid" class="Role"/>

</set>

</class>

</hibernate-mapping>

基于List集合映射

public class Grade {

private int id;

private String name;

private List<Student>students = new ArrayList<Student>(0);

}

<hibernate-mapping package="cn.siggy.pojo">

<class name="Grade">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

<list name="students" cascade="all">

<!-- key表示外键  column外键列名-->

<key column="grade_id"></key>

<!-- 在多的一端 产生一列 用来表示顺序 如果不指明列名 默认为idx 值由hibernate来维护

 -->

<list-index column="sort"></list-index>

<!-- one-to-many 一对多  类Grade 中  students所表示类型 -->

<one-to-many class="Student"/>

</list>

</class>

 

 

 

 

 

 

 

 

基于map集合映射

public class Grade {

private int id;

private String name;

private Map<String,Student>students = new  HashMap<String,Student>(0);

}

<hibernate-mapping package="cn.siggy.pojo">

<class name="Grade">

<id name="id">

<generator class="native"></generator>

</id>

<property name="name"/>

<map name="students" cascade="all">

<!-- key表示外键 -->

<key column="grade_id"/>

<!-- map-key是映射为map集合时,对应key值  key值 建议为唯一 -->

<map-key type="string" column="name"/>

<one-to-many class="Student"/>

</map>

</class>

</hibernate-mapping>

基于一张表的继承映射

public class Person {

private int id;

private String name;

private int age;

}

public class Studentextends Person{

private String work;

}

public class Teacherextends Person{

private int salary;

}

<hibernate-mapping package="cn.siggy.pojo">

<class name="Person">

<id name="id" column="id">

<generator class="native"></generator>

</id>

<!-- 指明鉴别器 -->

<discriminator column="type" type="string"/>

<property name="name"/>

<property name="age"/>

<subclass name="Student" discriminator-value="s">

<property name="work"/>

</subclass>

<subclass name="Teacher" discriminator-value="t">

<property name="salary"/>

</subclass>

</class>

</hibernate-mapping>

 

原创粉丝点击