JavaEE(14) - JPA关联映射

本文详细介绍了Java中ORM技术下的七种关联映射方式,包括单向及双向的N-1、1-1、1-N和N-N关联,并提供了具体的代码实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 单向N-1关联映射

2. 单向1-1关联映射

3. 单向1-N关联映射

4. 单向N-N关联映射

5. 双向1-1关联映射

6. 双向1-N关联映射

7. 双向N-N关联映射

1. 单向N-1关联映射(Net Beans创建Java Project, 项目名称:UnidirectionalManyToOne)

Person.java

package org.crazyit.model;

import javax.persistence.*;

@Entity
@Table(name = "person_table")
public class Person {

    //标识属性
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int personid;

    private String name;
    private int age;

    // constructor

    // setter
    // getter
}

Address.java

package org.crazyit.model;

import javax.persistence.*;

@Entity
@Table(name = "address_table")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int addressid;

    private String detail;

    @ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Person.class)
    @JoinColumn(name = "person_id", nullable = false, updatable = false)
    private Person person;

    public Address() {
    }

    public Address(String detail) {
        this.detail = detail;
    }

    // setter
    // getter
}

persistence.xml(参见12.2)

JpaQs.java(参见12.2)

2. 单向1-1关联映射(Net Beans创建Java Project, 项目名称:UnidirectionalOneToOne)

Person.java

package org.crazyit.model;

import javax.persistence.*;

@Entity
@Table(name = "person_table")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int personid;

    private String name;
    private int age;

    // constructor

    // setter
    // getter
}

Address.java

package org.crazyit.model;

import javax.persistence.*;

@Entity
@Table(name = "address_table")
public class Address {

    //标识属性
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int addressid;

    private String detail;

    @OneToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Person.class)
    @JoinColumn(name = "person_id", nullable = false, updatable = false)
    private Person person;

    // constructor

    // setter
    // getter
}

persistence.xml(参见12.2)

JpaQs.java(参见12.2)

3. 单向1-N关联映射(Net Beans创建Java Project, 项目名称:UnidirectionalOneToMany)

Person.java

package org.crazyit.model;

import javax.persistence.*;
import java.util.*;

@Entity
@Table(name = "person_table")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int personid;

    private String name;
    private int age;
    
    //1-N关联关系,使用Set来保存关联实体
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Address.class)
    @JoinColumn(name = "person_id", nullable = false)
    private Set<Address> addresses = new HashSet<Address>();

    // constructor

    // setter
    // getter
}

Address.java

package org.crazyit.model;

import javax.persistence.*;

@Entity
@Table(name = "address_table")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int addressid;

    private String detail;

    // constructor

    // setter
    // getter
}

persistence.xml(参见12.2)

JpaQs.java(参见12.2)

4. 单向N-N关联映射(Net Beans创建Java Project, 项目名称:UnidirectionalManyToMany)

Person.java

package org.crazyit.model;

import javax.persistence.*;
import java.util.*;

@Entity
@Table(name = "person_table")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int personid;

    private String name;
    private int age;
    
    //N-N关联关系,使用Set来保存关联实体
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Address.class)
    @JoinTable(
            name = "person_address",
            joinColumns = @JoinColumn(name = "person_id"),
            inverseJoinColumns = @JoinColumn(name = "address_id")
    )
    private Set<Address> addresses = new HashSet<Address>();

    // constructor

    // setter
    // getter
}

Address.java

package org.crazyit.model;

import javax.persistence.*;

@Entity
@Table(name = "address_table")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int addressid;

    private String detail;

    // constructor

    // setter
    // getter
}

persistence.xml(参见12.2)

JpaQs.java

package lee;

import java.util.List;
import javax.persistence.*;

import org.crazyit.model.*;

public class JpaQs {

    private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("qs");

    public static void main(String[] args) {
        EntityManager em = emf.createEntityManager();
        
        Person sun = new Person();
        sun.setName("sunwukong");
        sun.setAge(500);
        
        Person zhu = new Person();
        zhu.setName("zhubajie");
        zhu.setAge(380);
        
        Address road = new Address("The road to Indian.");
        
        try {
            em.getTransaction().begin();
            
            sun.getAddresses().add(new Address("The water hole to the mountain."));
            sun.getAddresses().add(road);
            
            zhu.getAddresses().add(new Address("Gao Laozhuang."));
            zhu.getAddresses().add(road);

            em.persist(sun);
            em.persist(zhu);

            em.getTransaction().commit();
        } 
        finally {
            em.close();
        }
    }
}

 

5. 双向1-1关联映射(Net Beans创建Java Project, 项目名称:BidirectionalOneToOne)

Person.java

package org.crazyit.model;

import javax.persistence.*;

@Entity
@Table(name = "person_table")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int personid;

    private String name;
    private int age;

    /* 设置了mappedBy属性表明Person实体不控制关联关系,*/
    @OneToOne(mappedBy = "person", cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Address.class)
    private Address address;

    // constructor

    // setter
    // getter

}

Address.java

package org.crazyit.model;

import javax.persistence.*;

@Entity
@Table(name = "address_table")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int addressid;

    private String detail;

    @OneToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Person.class)
    @JoinColumn(name = "person_id", nullable = false, updatable = false)
    private Person person;

    // constructor

    // setter
    // getter
}

persistence.xml(参见12.2)

JpaQs.java(参见12.2)

package lee;

import java.util.List;
import javax.persistence.*;

import org.crazyit.model.*;

public class JpaQs {
    private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("qs");

    public static void main(String[] args) {
        EntityManager em = emf.createEntityManager();
        
        Person person = new Person();
        person.setName("Sun");
        person.setAge(500);
        
        Address address = new Address();
        address.setDetail("Hua Guoshan");
        
        try {
            em.getTransaction().begin();

            //因为Person实体不控制关联关系,因此让Address实体控制关联关系
            address.setPerson(person); 

            em.persist(address);
            em.getTransaction().commit();
        } 
        finally {
            em.close();
        }
    }
}

6. 双向1-N关联映射(Net Beans创建Java Project, 项目名称:BidirectionalOneToMany)

Person.java

package org.crazyit.model;

import javax.persistence.*;
import java.util.*;

@Entity
@Table(name = "person_table")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int personid;

    private String name;
    private int age;

    /* 设置了mappedBy属性表明Person实体不控制关联关系,
     因此不能增加@JoinTable和@JoinColumn修饰*/
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "person", targetEntity = Address.class)
    private Set<Address> addresses = new HashSet<Address>();

    // constructor

    // setter
    // getter
}

Address.java

package org.crazyit.model;

import javax.persistence.*;

@Entity
@Table(name = "address_table")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int addressid;
    
    private String detail;
    
    @ManyToOne(fetch = FetchType.EAGER, targetEntity = Person.class, cascade = CascadeType.ALL)
    /* 使用@JoinColumn来配置外键列的信息 */
    @JoinColumn(name = "person_id", nullable = true)
    private Person person;

    // constructor

    // setter
    // getter
}

persistence.xml(参见12.2)

JpaQs.java(参见12.2)

7. 双向N-N关联映射(Net Beans创建Java Project, 项目名称:BidirectionalManyToMany)

Person.java

package org.crazyit.model;

import javax.persistence.*;
import java.util.*;

@Entity
@Table(name = "person_table")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int personid;

    private String name;
    private int age;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Address.class)
    @JoinTable(
            name = "person_address",
            joinColumns = @JoinColumn(name = "person_id"),
            inverseJoinColumns = @JoinColumn(name = "address_id")
    )
    private Set<Address> addresses = new HashSet<Address>();

    // constructor

    // setter
    // getter
}

Address.java

package org.crazyit.model;

import javax.persistence.*;
import java.util.*;

@Entity
@Table(name = "address_table")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int addressid;

    private String detail;

    /* 设置了mappedBy属性表明Address实体不控制关联关系,
     因此不能增加@JoinTable和@JoinColumn修饰*/
    @ManyToMany(cascade = CascadeType.ALL, mappedBy = "addresses", fetch = FetchType.LAZY, targetEntity = Person.class)
    private Set<Person> persons = new HashSet<Person>();

    // constructor

    // setter
    // getter
}

persistence.xml(参见12.2)

JpaQs.java(参见12.2)

 

转载于:https://www.cnblogs.com/thlzhf/p/4249756.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值