spring data jpa 防止内存溢出的 一对多,多对多配置,加了@Data也没事,(其实是可以简单配置的)
先来看一对多的例子:
用文章表和作者表,文章表为操作主体,是主动的一方
@OneToMany:
作用:建立一对多的关系映射
属性:
targetEntityClass:指定多的多方的类的字节码(可以省略)
mappedBy:指定从表实体类中引用主表对象的名称。(放弃维护权的配置)
cascade:指定要使用的级联操作(看需求增加)
fetch:指定是否采用延迟加载(看需求增加)
orphanRemoval:是否使用孤儿删除(看需求增加)
@ManyToOne
作用:建立多对一的关系
属性:
targetEntityClass:指定一的一方实体类字节码(可以省略)
cascade:指定要使用的级联操作(看需求增加)
fetch:指定是否采用延迟加载(看需求增加)
optional:关联是否可选。如果设置为false,则必须始终存在非空关系。(看需求增加)
@JoinColumn(可以省略有默认)
作用:用于定义主键字段和外键字段的对应关系。
属性:
name:指定外键字段的名称(可以不写,有默认,如果要自己定义外键名称的话可以设置)
referencedColumnName:指定引用主表的主键字段名称(可以省略,有默认,自己定义引用主表的主键字段的话可以设置)
unique:是否唯一。默认值不唯一(看需求增加)
nullable:是否允许为空。默认值允许。(看需求增加)
insertable:是否允许插入。默认值允许。(看需求增加)
updatable:是否允许更新。默认值允许。(看需求增加)
columnDefinition:列的定义信息。(看需求增加)
@Entity
@Data
@Table(name="aoa_article")
public class Article {
/**
* @author: leebob
* @date: 2020年4月24日 下午3:20:02
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "article_id")
private Long id;
private String title;
private String content;// 文章全文内容
@ManyToOne
//@JoinColumn的配置也可以省略
@JoinColumn(name="aoa_author_id",referencedColumnName = "author_id")
private Author author;
}
@Entity
@Table(name = "aoa_author")
@Data
public class Author {
/**
* @author: leebob
* @date: 2020年4月24日 下午3:15:11
*/
@Id
@GeneratedValue(strategy =GenerationType.IDENTITY )
@Column(name="author_id")
private Long id;
private String name;
//作者表里不要出现文章表的对象集合
}
测试:
@Test
@Transactional
@Rollback(value = false)
public void findall() {
//没有发生内存溢出,能查出文章和它的做作者
List<Article> articles = articleDao.findAll();
articles.forEach(System.out::println);
}
多对多关系用用户和角色表来说明
用户表为主动的一方,就是维护的一方
@Entity
@Table(name="sys_user")
@Data
public class SysUser {
/**
* @author: leebob
* @date: 2020年4月24日 下午9:47:06
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="user_id")
private Long userId;
@Column(name="user_code")
private String userCode;
@Column(name="user_name")
private String userName;
@Column(name="user_password")
private String userPassword;
@Column(name="user_state")
private String userState;
@ManyToMany
@JoinTable(name = "sys_user_role",
joinColumns = @JoinColumn(name="user_id"),
inverseJoinColumns = @JoinColumn(name="role_id"))
private Set<SysRole> roles ;
}
@Entity
@Data
@Table(name="sys_role")
public class SysRole {
/**
* @author: leebob
* @date: 2020年4月24日 下午9:48:04
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="role_id")
private Long roleId;
@Column(name="role_name")
private String roleName;
@Column(name="role_memo")
private String roleMemo;
}
测试
@Test
@Transactional
@Rollback(value = false)
public void testfind() {
//查询所有用户和它所属的角色没有内存溢出
List<SysUser> users = userDao.findAll();
users.forEach(System.out::println);
}
总结:
@ManyToMany
作用:用于映射多对多关系
属性:
cascade:配置级联操作。 (看需求增加)
fetch:配置是否采用延迟加载。(看需求增加)
targetEntity:配置目标的实体类。(映射多对多的时候不用写)
@JoinTable(可以不配置有默认)
作用:针对中间表的配置
属性:
nam:配置中间表的名称(可以不写,有默认,如果要自己定义中间表的名字的话可以设置)
joinColumns:中间表的外键字段关联当前实体类所对应表的主键字(可以不写,有默认,如果要自定义中间表引用当前实体中的主键字段和自定义外键名称的话可以设置)
inverseJoinColumn:中间表的外键字段关联对方表的主键字段(可以不写,有默认,如果要自定义中间表引用对方实体中的主键字段和自定义外键名称的话可以设置)
@JoinColumn(可以不配置,上述的自定义设置需要用到这个注解)
作用:用于定义主键字段和外键字段的对应关系。
属性:
name:自定义外键字段的名称,可以不设置,有默认
referencedColumnName:引用主表的主键字段,可以不设置,有默认
unique:是否唯一。默认值不唯一
那最后可以有最简单的配置出炉了,测试可以生成下面的三张表
@Entity
@Table(name="sys_user")
@Data
public class SysUser {
/**
* @author: leebob
* @date: 2020年4月24日 下午9:47:06
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="user_id")
private Long userId;
@Column(name="user_code")
private String userCode;
@Column(name="user_name")
private String userName;
@Column(name="user_password")
private String userPassword;
@Column(name="user_state")
private String userState;
//多对多关系映射
@ManyToMany
private Set<SysRole> roles ;
}
@Entity
@Data
@Table(name="sys_role")
public class SysRole {
/**
* @author: leebob
* @date: 2020年4月24日 下午9:48:04
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="role_id")
private Long roleId;
@Column(name="role_name")
private String roleName;
@Column(name="role_memo")
private String roleMemo;
}
测试通过没有问题
下一篇: PHP设置进度条的方法_PHP