您的位置:首页 > 其它

JPA的一对多映射(单向)

2012-05-27 17:23 134 查看
  注意:这里说的是一对多的单向关联,不是一对多的双向关联。

  实体Author:作者。

  实体Book:作者写的书。

  Author和Book是一对多的关系。

  在JPA中,用@OneToMany来标识一对多的关系。实现一对多的单向关联,只需在代表一的实体(Author)中使用@OneToMany映射标注就可以了,代表多的实体不需要使用任何映射标注。

  有两种方式实现一对多的单向关联。一种是在只使用@OneToMany来标识,这种方式是通过一张第三方表来保存关系。还有一种是使用@OneToMany和@JoinColumn来标注,这种方式是在多的一方(Book)的表中增加一个外键列来保存关系。

  第一种方式,通过一张第三方表来实现一对多的单向关联:

  Author.java如下,需要注意private Set<Book> books = new HashSet<Book>()的注解。只是使用了@OneToMany。

package com.cndatacom.jpa.entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
*  作者
* @author Luxh
*/

@Entity
@Table(name="author")
public class Author {

@Id
@GeneratedValue
private Long id;

/**作者的名字*/
@Column(length=32)
private String name;

/**作者写的书*/
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)//级联保存、更新、删除、刷新;延迟加载
private Set<Book> books = new HashSet<Book>();

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<Book> getBooks() {
return books;
}

public void setBooks(Set<Book> books) {
this.books = books;
}

}


  

  Book.java如下,因为是单向的关联,所以这个实体不需要加任何的关联标识。

  

package com.cndatacom.jpa.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

/**
* 书
* @author Luxh
*/

@Entity
@Table(name="book")
public class Book {

@Id
@GeneratedValue
private Long id;

/**书名*/
@Column(length=32)
private String name;

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;
}

}


  只在Author实体中对private Set<Book> books = new HashSet<Book>()加上标注@OneToMany实现单向关联。这样就通过一个关联表来实现这种关联。生成数据库表如下,会以Author的表名和下划线和Book的表名生成一张表author_book来保存Author和Book的一对多单向映射。



  在author_book表中,存的是Auhtor的id和Book的id:



  第二种方式,通过在多方(Book)的表中增加一个外键列实现一对多的单向关联。

  Author.java如下,需要注意private Set<Book> books = new HashSet<Book>()的注解。同时使用了@OneToMany和@JoinColumn。

package com.cndatacom.jpa.entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
*  作者
* @author Luxh
*/

@Entity
@Table(name="author")
public class Author {

@Id
@GeneratedValue
private Long id;

/**作者的名字*/
@Column(length=32)
private String name;

/**作者写的书*/
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)//级联保存、更新、删除、刷新;延迟加载
@JoinColumn(name="author_id")//在book表增加一个外键列来实现一对多的单向关联
private Set<Book> books = new HashSet<Book>();

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<Book> getBooks() {
return books;
}

public void setBooks(Set<Book> books) {
this.books = books;
}

}


  Book.java不变。

  在数据库中只生成了两张表:author和book。



  再看book表的结构,会多了一列author_id。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: