JPA关联映射分为:
单向关联:单向1-1、单向1-N、单向N-1、单向N-N;
双向关联:双向1-1、双向1-N、双向N-N;
一、单向关联:
- 单向1-1(unidirection 1-1)
- 应用场景:假设一个人仅对应一个地址,一个地址也仅对应一个人;实体定义:
- 实体定义:Person:代表人实体; Address:代表地址实体;
Person实体类定义如下:
@Entity
@Table(name="rm_person")
public class Person {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="personPKGen")
@SequenceGenerator(name="personPKGen", sequenceName="PERSON_PK_GEN", allocationSize=1)
@Column(name="person_id", length=11)
private int personId;
@Column(length=256)
private String name;
@Column(length=11)
private int age;
public Person(){
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Address实体定义如下:
@Entity
@Table(name="rm_address")
public class Address {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="addressPKGen")
@SequenceGenerator(name="addressPKGen",sequenceName="ADDRESS_PK_GEN", allocationSize=1)
@Column(name="address_id",length=11)
private int addressId;
@Column(length=512)
private String detail;
public Address(){
}
public Address(String detail){
this.detail = detail;
}
@OneToOne(targetEntity=Person.class, cascade=CascadeType.ALL,optional=false, fetch=FetchType.EAGER)
@JoinColumn(name="person_id", nullable=false)
private Person person;
public Address(int addressId, String detail) {
super();
this.addressId = addressId;
this.detail = detail;
}
public int getAddressId() {
return addressId;
}
public void setAddressId(int addressId) {
this.addressId = addressId;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
在上面实体中,我们在Address实体中控制关联关系,在Address中增加了person属性,并用@OneToOne和@JoinColumn修饰该属性。
2. 单向1-N(unidirection 1-N)
- 应用场景:假设一个人对应多个地址,一个地址仅对应一个人;
- 实体定义:Person:代表人实体; Address:代表地址实体;
Address实体定义如下:
@Entity
@Table(name="rm_address")
public class Address {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="addressPKGen")
@SequenceGenerator(name="addressPKGen",sequenceName="ADDRESS_PK_GEN", allocationSize=1)
@Column(name="address_id",length=11)
private int addressId;
@Column(length=512)
private String detail;
public Address(){
}
public Address(String detail){
this.detail = detail;
}
public Address(int addressId, String detail) {
super();
this.addressId = addressId;
this.detail = detail;
}
public int getAddressId() {
return addressId;
}
public void setAddressId(int addressId) {
this.addressId = addressId;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
}
Person实体类定义如下:
@Entity
@Table(name="rm_person")
public class Person {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="personPKGen")
@SequenceGenerator(name="personPKGen", sequenceName="PERSON_PK_GEN", allocationSize=1)
@Column(name="person_id", length=11)
private int personId;
@Column(length=256)
private String name;
@Column(length=11)
private int age;
@OneToMany(targetEntity=Address.class, cascade= CascadeType.ALL, fetch=FetchType.LAZY)
@JoinColumn(name="person_id", nullable=false)
private Set<Address> addresses = new HashSet<Address>();
public Person(){
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Set<Address> getAddresses() {
return addresses;
}
public void setAddresses(Set<Address> addresses) {
this.addresses = addresses;
}
}
在上面实体中,我们在Person实体中控制关联关系,在Person中增加了Set<Address> addresses属性,并用@OneToMany和@JoinColumn修饰该属性。
3. 单向N-1(unidirection N-1)
- 应用场景:假设一个人对应多个地址,一个地址仅对应一个人;
- 实体定义:Person:代表人实体; Address:代表地址实体;
Person实体的定义:
@Entity
@Table(name="rm_person")
public class Person {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="personPKGen")
@SequenceGenerator(name="personPKGen", sequenceName="PERSON_PK_GEN", allocationSize=1)
@Column(name="person_id", length=11)
private int personId;
@Column(length=256)
private String name;
@Column(length=11)
private int age;
public Person(){
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Address实体的定义:
@Entity
@Table(name="rm_address")
public class Address {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="addressPKGen")
@SequenceGenerator(name="addressPKGen",sequenceName="ADDRESS_PK_GEN", allocationSize=1)
@Column(name="address_id",length=11)
private int addressId;
@Column(length=512)
private String detail;
public Address(){
}
public Address(String detail){
this.detail = detail;
}
@ManyToOne(targetEntity=Person.class, cascade=CascadeType.ALL,optional=false, fetch=FetchType.EAGER)
@JoinColumn(name="person_id", nullable=false)
private Person person;
public Address(int addressId, String detail) {
super();
this.addressId = addressId;
this.detail = detail;
}
public int getAddressId() {
return addressId;
}
public void setAddressId(int addressId) {
this.addressId = addressId;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
在上面实体中,我们在Address实体中控制关联关系,在Address中增加了 Person person 属性,并用@ManyToOne和@JoinColumn修饰该属性。
4. 单向N-N(unidirection N-N)
- 应用场景:假设一个人对应多个地址,一个地址也对应多个人;
- 实体定义:Person:代表人实体; Address:代表地址实体;
Address实体的定义:
@Entity
@Table(name="rm_address")
public class Address {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="addressPKGen")
@SequenceGenerator(name="addressPKGen",sequenceName="ADDRESS_PK_GEN", allocationSize=1)
@Column(name="address_id",length=11)
private int addressId;
@Column(length=512)
private String detail;
public Address(){
}
public Address(String detail){
this.detail = detail;
}
public Address(int addressId, String detail) {
super();
this.addressId = addressId;
this.detail = detail;
}
public int getAddressId() {
return addressId;
}
public void setAddressId(int addressId) {
this.addressId = addressId;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
}
Person实体的定义:
@Entity
@Table(name = "rm_person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "personPKGen")
@SequenceGenerator(name = "personPKGen", sequenceName = "PERSON_PK_GEN", allocationSize = 1)
@Column(name = "person_id", length = 11)
private int personId;
@Column(length = 256)
private String name;
@Column(length = 11)
private int age;
@ManyToMany(targetEntity = Address.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(
name = "rm_person2address",
joinColumns = @JoinColumn(name = "person_id", nullable = false),
inverseJoinColumns = @JoinColumn(name = "address_id", nullable = false))
private Set<Address> addresses = new HashSet<Address>();
public Person() {
}
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Set<Address> getAddresses() {
return addresses;
}
public void setAddresses(Set<Address> addresses) {
this.addresses = addresses;
}
}
在上面实体中,我们在Person实体中控制关联关系,在Person中增加了 Set<Address> addresses 属性,并用@ManyToMany和@JoinTable修饰该属性。
测试代码:
public class Test {
private static final EntityManagerFactory emf = Persistence
.createEntityManagerFactory("qs");
/**
* @param args
*/
public static void main(String[] args) {
EntityManager em = emf.createEntityManager();
try{
em.getTransaction().begin();
Person sun = new Person();
sun.setName("孙悟空");
sun.setAge(500);
Person zhu = new Person();
zhu.setName("猪八戒");
zhu.setAge(380);
Address load = new Address("西天取经路");
sun.getAddresses().add(load);
sun.getAddresses().add(new Address("花果山福地,水帘洞洞天"));
zhu.getAddresses().add(load);
zhu.getAddresses().add(new Address("高老庄"));
em.persist(sun);
em.persist(zhu);
em.getTransaction().commit();
}finally{
em.close();
}
}
}