JPA:映射单向多对一关联关系

1.单向多对一是jpa中常用的关联关系,这里以订单和顾客举例子(多个订单可以对应同一顾客)

2.顾客实体类代码如下:

package com.wayne.helloworld;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

/*
 * 如果不添加@Table注解,则表名与实体类名相同
 */

@Table(name="JPA_CUSTOMERS")
@Entity
public class Customer {
private Integer id;
private String lastName;
private String email;
private int age;
private Date createdDate;
private Date birthDay;
@Column(name="ID")
@GeneratedValue(strategy=GenerationType.AUTO)
@Id
public Integer getId() {
    return id;
}
public void setId(Integer id) {
    this.id = id;
}
@Column(name="LAST_NAME",length=50,nullable=true)
public String getLastName() {
    return lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
}

//若属性名与字段名相同,则不需要填写注解
public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}

//精度时间戳
@Temporal(TemporalType.TIMESTAMP)
public Date getCreatedDate() {
    return createdDate;
}
public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
}
@Temporal(TemporalType.DATE)
public Date getBirthDay() {
    return birthDay;
}
public void setBirthDay(Date birthDay) {
    this.birthDay = birthDay;
}

//工具方法,不需要映射为某个数据库表的一列
@Transient
public String getInfo(){
    return "lastName:"+this.getLastName();
}
@Override
public String toString() {
    return "Customer [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age + ", createdDate="
            + createdDate + ", birthDay=" + birthDay + "]";
}

}

3.订单代码如下:

package com.wayne.helloworld;

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.ManyToOne;
import javax.persistence.Table;

@Table(name="JPA_ORDERS")
@Entity
public class Order {
private Integer id;
private String orderName;
private Customer customer;
@GeneratedValue
@Id
public Integer getId() {
    return id;
}
public void setId(Integer id) {
    this.id = id;
}
@Column(name="ORDER_NAME")
public String getOrderName() {
    return orderName;
}
public void setOrderName(String orderName) {
    this.orderName = orderName;
}

/*单向多对一的关联关系
使用@ManyToOne来映射多对一的关联关系
使用@JoinColumn来映射外键
name为关联表的列列名
可使用@ManyToOne的fetch属性来修改默认的关联属性的加载策略*/

@JoinColumn(name="CUSTOMER_ID")
@ManyToOne
public Customer getCustomer() {
    return customer;
}
public void setCustomer(Customer customer) {
    this.customer = customer;
}
}

4.首先测试插入数据:

.运行后数据库数据已经结构如下:

.运行后控制台输出如下:

很明显,当我们创建临时的客户和订单对象,再做出关联,最后先插入客户数据再插入订单数据,

控制台输出的是三条插入语句

.另外一种情况,当我们做出关联之后,先插入订单数据然后再插入客户数据:

.运行后,控制台输出如下:

.可以很明显的看出,首先jpa先插入了order的数据但是外键是Null的,在添加顾客之后再更新为关联的顾客id

.所以在添加关联关系的情况下,首先要添加"一"的数据,然后再添加"多"的数据,不然会多执行sql语句,影响性能

5.测试查询:

控制台输出如下:

可见默认情况下,使用左外连接的方式来获取多的一端的对象和其关联的一的一端的对象

.在Order实体类中,我们在ManyToOne注解后添加如下,开启懒加载,只查询我们需要的对象,如果不查询顾客的话,

那么只加载订单对象:

.然后我们再次运行查询,控制台输出如下:

6.删除以及更新代码如下,这里不再过多赘述:

猜你喜欢

转载自blog.csdn.net/weixin_40740613/article/details/84313033