Hibernate学习笔记(5):多对一关联映射
many2one
关联映射本质:
将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用
利用class的many-to-one标签
<many-to-one name="group" column="groupid">
会自动在user表中添加一个字段,作为外键参照group表
persistent状态的对象不能引用transient状态的对象,否则抛出TransientObjectException
1、保存的时候先保存group然后保存user
2、使用级联,级联对保存、更新、删除有效,在many-to-one标签中设置casecade设置为save-update,还可以设置为all,delete,none,默认为none。不建议级联删除,会出现问题。
加载:
get或者load加载user时,会自动加载group
<many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由column属性定义的,如果忽略了这个属性,那么默认的属性与实体一致
实例:
User类
package com
.
hk
.
hibernate
;
public class User {
private int id ;
private String name ;
private Group group ;
public int getId () {
return id ;
}
public void setId ( int id ) {
this . id = id ;
}
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
public Group getGroup () {
return group ;
}
public void setGroup ( Group group ) {
this . group = group ;
}
}
public class User {
private int id ;
private String name ;
private Group group ;
public int getId () {
return id ;
}
public void setId ( int id ) {
this . id = id ;
}
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
public Group getGroup () {
return group ;
}
public void setGroup ( Group group ) {
this . group = group ;
}
}
Group类
package com
.
hk
.
hibernate
;
public class Group {
int id ;
String name ;
public int getId () {
return id ;
}
public void setId ( int id ) {
this . id = id ;
}
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
}
public class Group {
int id ;
String name ;
public int getId () {
return id ;
}
public void setId ( int id ) {
this . id = id ;
}
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
}
User的映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 默认表明与类名一致,可以通过设置class的table属性来设置表明 -->
<class name= "com.hk.hibernate.User" >
<!--主键,自动生成唯一值,必须放在最前面 -->
<id name= "id" >
<generator class= "native" />
</id>
<property name= "name" />
<many-to-one name= "group" column= "groupid" />
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 默认表明与类名一致,可以通过设置class的table属性来设置表明 -->
<class name= "com.hk.hibernate.User" >
<!--主键,自动生成唯一值,必须放在最前面 -->
<id name= "id" >
<generator class= "native" />
</id>
<property name= "name" />
<many-to-one name= "group" column= "groupid" />
</class>
</hibernate-mapping>
group的映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 默认表明与类名一致,注意改名,否则会出错-->
<class name= "com.hk.hibernate.Group" table= "_group" >
<!--主键,自动生成唯一值,必须放在最前面 -->
<id name= "id" >
<generator class= "native" />
</id>
<property name= "name" />
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 默认表明与类名一致,注意改名,否则会出错-->
<class name= "com.hk.hibernate.Group" table= "_group" >
<!--主键,自动生成唯一值,必须放在最前面 -->
<id name= "id" >
<generator class= "native" />
</id>
<property name= "name" />
</class>
</hibernate-mapping>