hibernate(八)-----组建映射和关系映射(二)
来源:互联网 发布:win7管理员运行cmd网络 编辑:程序博客网 时间:2024/05/12 10:43
组件映射
可以简单认为是多个类共建了一张表,一对一关系的表,可以放在一张表中,其中一张表的所有属性,作为新表的一个组件,组件若用数据库来说,大致为一个复合属性。
具体实现:
husband.class
package com.hibernate.model;
import javax.*;
@Entity
public class Husband {
private int id;
private String name;
private Wife wife;
@Id
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
@Embedded
public Wife getWife() {
return wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
wife.class
package com.hibernate.model;
import javax.persistence.*
public class Wife { //注意wife作为一个类,一个组件,所有不用@entity将其持久化了
private String wifename;
private int age;
//@Column(name="w_name") //作为改名来用,其他标签,没有@entity声明,似乎不能,如@id,但改名最好也不在这里改,直接在定义那里改就好,没有@entity最好不用标签,其他改法看文档
public String getWifename() {
return wifename;
}
public void setWifename(String wifename) {
this.wifename = wifename;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
xml
多了
<component name="wife">
<property name="age" not-null="true"></property>
<property name="wifename"></property>
</component>
这里指组件的,其他没什么
多对一的单向关联
annotation
把@onetoone换成
@ManyToOne
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
其他不变即可
xml
在user.hbm.xml中
<many-to-one name="group" class="Group" column="g_id">只是把unique去掉就OK了,单向只设一个,class填的是被关联的类的名字
一对多单向关联
annotation中
在一那一方添加,
private Set<User> users = new HashSet<User>(){};
@OneToMany
@JoinColumn(name="gggid")
注意@JoinColumn不能少,少了的话,就生成三张表,其默认是多对多
一对多刚好和多对一相反,多对一是在多的那方设,一对多是在一这方。
xml
在group.hbm.xml中
<set name="users">
<key column="g_id"></key> //设置多的一方的表中的属性和作为外键的名字,若column不写,则默认主键名,作为外键的名字
<one-to-many class="User"></one-to-many>
</set>
在一的那方,写上这个,注意要把多的那方<many-to-one>删去,结果和多对一一样
一对多和多对一的双向
其实就是双方加,把其中一方屏蔽掉就OK了
annotation
多的是@ManyToOne,一的是@OneToMany(mappby=""),习惯把onetomany屏蔽,因为我们都是在多的直接添加比较直观,注意
@OneToMany
@JoinColumn(name="gggid"),jointcolumn不能写,否则系统会把写的值ggid也添入多的表中
xml
多的是 <many-to-one name="group" class="Group" column="g_id"></many-to-one>,一的是 <set name="users">
<key column="g_id"></key> //一定要写值,不然默认主键
<one-to-many class="User"></one-to-many>
</set>
注意两个column务必要一样,否则和会annotation,jointcolumn一样,得出多的那张表中多出几个属性,
多对多单向关联
annotation
选一方来设置如:Teacher.class
private Set<Student> students = new HashSet<Student>(){};
另一方不设。
写
@ManyToMany
@JoinTable(name="tt_ss")
这种是省略的写法,如果对表名没要求,@JoinTable也可以省略
详略写法
@ManyToMany
@JoinTable(name="t_s",
joinColumns={@JoinColumn(name="teacher_id")},当前这个类这张表的对应的外键id名
inverseJoinColumns={@JoinColumn(name="student_id")}对方那张表对应的外键的id名,即写入t_s的属性名
)
xml
在teacher.hbm.xml中写
<set name="students" table="t_s"><!-- 这个students由前面定义的那个Teacher里面属性来定
--><key column="teacher_id"></key><!-- 指向自己表的外键id名
--><many-to-many class="Student" column="student_id"></many-to-many>
<!-- 指向对面的那张表的外键id名 -->
</set>
student不用配置
多对多双向关联
其实两边都进行相同设置即可
annotation
记住把其中@ManyToMany(mappby=""),即可
xml
两边都进行相似的设计,注意,两边设置的名字比如teacher_id要一致,不然中间表会产生新的属性
综述:可以简单划分,一对一和多对一的配置,基本相似,xml都是加many-to-one,特别是annotation中,只有标签有点不同而已。而一对多,和多对多配置几乎一样,只是一对多时,必须写@jointcolumn,xml都用set的来写,具体差别,可以细查
错误:多是xml的备注,习惯用//而导致,要么属性名写得有偏差
- hibernate(八)-----组建映射和关系映射(二)
- Hibernate映射关系(二)
- hibernate组建映射
- hibernate 组建映射
- Hibernate映射(二)——七种映射关系
- Hibernate对象关系映射----关联映射(二)
- Hibernate 映射实体关联关系(二)
- Hibernate之关系映射(二)
- Hibernate中的映射关系(二)
- Hibernate(八)Hibernate集合Map关系映射
- Hibernate关系映射总结(二)
- hibernate继承关系映射二
- Hibernate关系映射总结(二)
- Hibernate学习笔记(八)【映射实体关系】
- Hibernate学习笔记(八)【映射实体关系】
- 精通Hibernate之映射继承关系八
- Hibernate旅程(五)Hibernate映射--基本类映射和对象关系映射
- Hibernate关系映射和HQL
- 读书笔记之编程之美 - 2.10 寻找数组中的最大值和最小值
- GNU-make中文手册 读书笔记(二)
- poj1182——食物链
- 假如你的男友是修井工
- WebService之Axis2 使用services.xml文件发布WebService
- hibernate(八)-----组建映射和关系映射(二)
- SQL语句实例学习汇总
- 关于新手JDK路径配置的问题
- test
- Choreography and Orchestration
- xorp-1.6的安装
- 继续畅通工程
- SO_DONTROUTE和SO_BINDTODEVICE的深层次分析
- arp协议的混乱引发的思考