Hibernate 的关联关系映射

一对多的关系

public class Department {
private Integer id;
private String departmentName;
private Set<Employee> employees=new HashSet<Employee>();
public Integer getId() {
    return id;
}
public void setId(Integer id) {
    this.id = id;
}
public String getDepartmentName() {
    return departmentName;
}
public void setDepartmentName(String departmentName) {
    this.departmentName = departmentName;
}
public Set<Employee> getEmployees() {
    return employees;
}
public void setEmployees(Set<Employee> employees) {
    this.employees = employees;
}
@Override
public String toString() {
    return "Department [departmentName=" + departmentName + ", id=" + id + "]";
}
}

public class Employee {
private Integer id;
private String name;
private Department department;
public Integer getId() {
    return id;
}
public void setId(Integer id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public Department getDepartment() {
    return department;
}
public void setDepartment(Department department) {
    this.department = department;
}
@Override
public String toString() {
    return "Employee [ id=" + id + ", name="
            + name + "]";
}

}


<!-- 配置映射的包名,一般和对象对应 -->
<hibernate-mapping package="com.hibernate.reflection">
    <!-- 配置数据库的表名 -->
    <class name="Department" table="department">
    <!-- 配置字段 -->
        <id name="id" type="int" column="id">
        <!-- 表示使用mysql自带的方法 -->
            <generator class="native"/>
        </id>
    <property name="departmentName" column="departmentName"/>
        <set name="employees" >
        <key column="departmentID"></key>
        <one-to-many class="Employee"/>    
        </set>
    </class>
    
</hibernate-mapping>

<!-- 配置映射的包名,一般和对象对应 -->
<hibernate-mapping package="com.hibernate.reflection">
    <!-- 配置数据库的表名 -->
    <class name="Employee" table="employee">
    <!-- 配置字段 -->
        <id name="id" type="int" column="id">
        <!-- 表示使用mysql自带的方法 -->
            <generator class="native"/>
        </id>
    <property name="name"/>
        
    <many-to-one name="department" class="Department" column="departmentID"></many-to-one>
        
    </class>
    
</hibernate-mapping>


基于外键的一对一关联

public class Person {
private Integer id;
private String name;
private IdCard idcard;
public Integer getId() {
    return id;
}
public void setId(Integer id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
@Override
public String toString() {
    return "Person [id=" + id + ", name=" + name + "]";
}
public IdCard getIdcard() {
    return idcard;
}
public void setIdcard(IdCard idcard) {
    this.idcard = idcard;
}

}

public class IdCard {
private Integer id;
private String number;
private Person person;
public Integer getId() {
    return id;
}
public void setId(Integer id) {
    this.id = id;
}
public String getNumber() {
    return number;
}
public void setNumber(String number) {
    this.number = number;
}
public Person getPerson() {
    return person;
}
public void setPerson(Person person) {
    this.person = person;
}
@Override
public String toString() {
    return "IdCard [id=" + id + ", number=" + number + "]";
}

}

<!-- 配置映射的包名,一般和对象对应 -->
<hibernate-mapping package="com.hibernate.reflection">
    <!-- 配置数据库的表名 -->
    <class name="Person" table="person">
    <!-- 配置字段 -->
        <id name="id" type="int" column="id">
        <!-- 表示使用mysql自带的方法 -->
            <generator class="native"/>
        </id>
        <property name="name"/>
<one-to-one name="idcard" class="IdCard" property-ref="person"></one-to-one>
    </class>
    
</hibernate-mapping>

<!-- 配置映射的包名,一般和对象对应 -->
<hibernate-mapping package="com.hibernate.reflection">
    <!-- 配置数据库的表名 -->
    <class name="IdCard" table="idCard">
    <!-- 配置字段 -->
        <id name="id" type="int" column="id">
        <!-- 表示使用mysql自带的方法 -->
            <generator class="native"/>
        </id>
        <property name="number"/>
<many-to-one name="person" class="Person" column="person_Id" unique="true"></many-to-one>
    
    </class>
    
</hibernate-mapping>

基于主键的一对一


IdCard.hbm.xml映射文件

[html] view plain
copy

<?xmlversion="1.0"?> 
<!DOCTYPE hibernate-mappingPUBLIC  
   "-//Hibernate/Hibernate Mapping DTD3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
   <class name="com.hibernate.IdCard"table="t_idCard"> 
       <idname="id"> 
           <generatorclass="native"> 
           </generator> 
       </id> 
       <propertyname="cardNo"/> 
   </class> 
</hibernate-mapping> 


Person.hbm.xml映射文件

[html] view plain
copy

<?xmlversion="1.0"?> 
<!DOCTYPE hibernate-mappingPUBLIC  
   "-//Hibernate/Hibernate Mapping DTD3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
   <class name="com.hibernate.Person"table="t_person"> 
       <idname="id"> 
           <!-- 采用foreign生成策略,foreign会取得关联对象的标识--> 
           <generatorclass="foreign"> 
               <!-- property只关联对象--> 
               <paramname="property">idCard</param> 
           </generator> 
       </id> 
       <propertyname="name"/> 
       <!--one-to-one指示hibernate如何加载其关联对象,默认根据主键加载 
           也就是拿到关系字段值,根据对端的主键来加载关联对象 
        --> 
       <one-to-one name="idCard"constrained="true"/> 
   </class> 
</hibernate-mapping> 


多对多关联:

public class Student {
private Long id;
private String name;
private Set<Teacher> teachers=new HashSet<Teacher>();

public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public Set<Teacher> getTeachers() {
    return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
    this.teachers = teachers;
}
@Override
public String toString() {
    return "Student [name=" + name + ", studentId=" + id + "]";
}
}

public class Teacher {
private Long id;
private String name;
private Set<Student> students=new HashSet<Student>();

@Override
public String toString() {
    return "Teacher [name=" + name + ", teacherId=" + id + "]";
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public Set<Student> getStudents() {
    return students;
}
public void setStudents(Set<Student> students) {
    this.students = students;
}
}

<!-- 配置映射的包名,一般和对象对应 -->
<hibernate-mapping package="com.hibernate.reflection">
    <!-- 配置数据库的表名 -->
    <class name="Student" table="student">
    <!-- 配置字段 -->
    <id name="id">
            <generator class="native"></generator>
        </id>
    <property name="name" column="name"/>
        <!-- <set name="teachers" table="teacher_student">
键值是表示外键的那一列的列名
    <key column="studentId"></key>
    <many-to-many class="Teacher" column="teacherId"></many-to-many>
    </set>
    -->
    <!-- 表示学生记住老师 -->
        <set name="teachers" table="teacher_student" inverse="false">
            <key column="studentId"></key>
            <many-to-many class="Teacher" column="teacherId"></many-to-many>
        </set>
    </class>
    
</hibernate-mapping>

<!-- 配置映射的包名,一般和对象对应 -->
<hibernate-mapping package="com.hibernate.reflection">
    <!-- 配置数据库的表名 -->
    <class name="Teacher" table="teacher">
    <!-- 配置字段 -->
    <id name="id">
            <generator class="native"></generator>
        </id>
    <property name="name"  column="name"/>
    <!--      <set name="students" table="teacher_student">
        <key column="teacherId"></key>
        <many-to-many class="Student" column="studentId"></many-to-many>
        </set>
        -->
        <set name="students" table="teacher_student" inverse="true" >
            <key column="teacherId"></key>
            <many-to-many class="Student" column="studentId"></many-to-many>
        </set>
    </class>
    
</hibernate-mapping>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值