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的备注,习惯用//而导致,要么属性名写得有偏差

原创粉丝点击