当前位置:首页 > 开发 > 数据库 > 正文

Hibernate---一对多,单向和双向注解

发表于: 2013-08-09   作者:天堂路   来源:转载   浏览:
摘要:         一对多单向:    import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import

  

     一对多单向:

  

import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
@Entity
public class Department {
 private long id;
 private String name;
 private Set<Employee> emps;
 @Id
 @GeneratedValue
 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;
 }
 @OneToMany(cascade = CascadeType.ALL)
 @JoinColumn(name = "dept_id")//不加该注解,则会生成中间表。加上该注解则会在多方的表中生成一列"dept_id"
 public Set<Employee> getEmps() {
  return emps;
 }
 public void setEmps(Set<Employee> emps) {
  this.emps = emps;
 }
}

 

    

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;
@Entity
public class Employee {
 private long id;
 private Department depart;
 private String name;
 @Id
 @GeneratedValue
 public long getId() {
  return id;
 }
 public void setId(long id) {
  this.id = id;
 }
 
 @Transient//不插入数据库
 public Department getDepart() {
  return depart;
 }
 public void setDepart(Department depart) {
  this.depart = depart;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}

    注意上面这个注解,在被维护方(一方)的@JoinColumn要name是维护方以数据库表形式存在的ID,除了有一个@JoinColumn外也可以有一个referencedColumnName这个属性

 

    上面是一对多其中一种方式,另外一种就是在维护端设计关联关系,代码如下:

 

import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
@Entity
public class Department {
 private long id;
 private String name;
 @Id
 @GeneratedValue
 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;
 }

}

    

 

     

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;
@Entity
public class Employee {
 private long id;
 private Department depart;
 private String name;
 @Id
 @GeneratedValue
 public long getId() {
  return id;
 }
 public void setId(long id) {
  this.id = id;
 }
 
@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.LAZY)
    @JoinColumn(name="dept_id")
 public Department getDepart() {
  return depart;
 }
 public void setDepart(Department depart) {
  this.depart = depart;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}
 

 

 

     其实一对多就是在多的一方也就是维护方建立关联少一个的关联关系(一般是通过外键ID)

     一对多双向:

    

      

import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
@Entity
public class Department {
 private long id;
 private String name;
 private Set<Employee> emps;
 @Id
 @GeneratedValue
 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;
 }
@OneToMany(mappedBy="depart",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
 public Set<Employee> getEmps() {
  return emps;
 }
 public void setEmps(Set<Employee> emps) {
  this.emps = emps;
 }
}

 

     

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;
@Entity
public class Employee {
 private long id;
 private Department depart;
 private String name;
 @Id
 @GeneratedValue
 public long getId() {
  return id;
 }
 public void setId(long id) {
  this.id = id;
 }
 
@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.LAZY)
 @JoinColumn(name="dept_id")
 public Department getDepart() {
  return depart;
 }
 public void setDepart(Department depart) {
  this.depart = depart;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}

 

 

 

     一对多双向关联,其实也是在维护端设置关联关系。

    

 

 

Hibernate---一对多,单向和双向注解

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在我们以前的数据库设计中,设计表就不是一件轻松的事情。多种事物之间往往都是有这样那样的关系的
在我们以前的数据库设计中,设计表就不是一件轻松的事情。多种事物之间往往都是有这样那样的关系的
[原]Hibernate一对多(单向) [标题]:Hibernate一对多(单向) [时间]:2009-6-12 [摘要]:单向一对多关联
[原]Hibernate一对多(单向) [标题]:Hibernate一对多(单向) [时间]:2009-6-12 [摘要]:单向一对多关联
[正文]: Hibernate一对多关联,例如一个用户有多张银行卡(只考虑用户到银行卡的单向一对多关联)。由
[原]Hibernate一对多(单向) [标题]:Hibernate一对多(单向) [时间]:2009-6-12 [摘要]:单向一对多关联
类图如下: 在关系模型中,同多对一一样,还是在Student表中有一个外键指向Class表。 在配置的时候
JPA的一对多映射(单向) Posted on 2012-05-27 17:23 CN.programmer.Luxh 阅读(560) 评论( 0) 编辑
JPA的一对多映射(单向) Posted on 2012-05-27 17:23 CN.programmer.Luxh 阅读(560) 评论( 0) 编辑
前面分享了一些学习grails的心得,可是grails的知识还远不止这些,这次整理了一点有关grails一对多
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号