`

JPA CascadeType.PERSIST

    博客分类:
  • java
 
阅读更多
 
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.lxz.entity;

import javax.persistence.*;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.hibernate.validator.constraints.NotBlank;

//JPA标识
@Entity
@Table(name = "t_task")
public class Task extends IdEntity {

	private String title;
	private String description;
	private User user;

	// JSR303 BeanValidator的校验规则
	@NotBlank
	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	// JPA 基于USER_ID列的多对一关系定义
	@ManyToOne(cascade = CascadeType.MERGE)
	@JoinColumn(name = "user_id")
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
}



  CascadeType.PERSIST会级联保存,所有对像都保存到数据库

  @ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "user_id")

  User user = new User();
        user.setLoginName("persistTest");
        user.setName("persistTest");
        user.setPassword("111111");
        user.setSalt("111111");
        user.setRoles("aaa");
        user.setRegisterDate(new Date());


        Task t = new Task();
        t.setTitle("persistTest");
        t.setUser(user);

        taskDao.save(t);

        logger.debug("task id={}",t.getId());
        logger.debug("user id={}",user.getId());
       
Hibernate:
    insert
    into
        t_user
        (id, login_name, name, password, register_date, roles, salt)
    values
        (null, ?, ?, ?, ?, ?, ?)
Hibernate:
    insert
    into
        t_task
        (id, description, title, user_id)
    values
        (null, ?, ?, ?)
       
15:29:16.091 [main] DEBUG com.lxz.repository.TaskDaoTest - task id=6
15:29:16.092 [main] DEBUG com.lxz.repository.TaskDaoTest - user id=3


  如果改为CascadeType.MERGE,则会出错
 
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "user_id")

  User user = new User();
        user.setLoginName("persistTest");
        user.setName("persistTest");
        user.setPassword("111111");
        user.setSalt("111111");
        user.setRoles("aaa");
        user.setRegisterDate(new Date());


        Task t = new Task();
        t.setTitle("persistTest");
        t.setUser(user);

        taskDao.save(t);

        logger.debug("task id={}",t.getId());
        logger.debug("user id={}",user.getId());
       
Hibernate:
    insert
    into
        t_task
        (id, description, title, user_id)
    values
        (null, ?, ?, ?)
15:55:33.891 [main] WARN  o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 23502, SQLState: 23502
15:55:33.893 [main] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - NULL not allowed for column "USER_ID"; SQL statement:
insert into t_task (id, description, title, user_id) values (null, ?, ?, ?) [23502-176]



分享到:
评论

相关推荐

    10_JPA详解_JPA中的一对多双向关联与级联操作.zip

    JPA提供了一系列的级联类型,如`CascadeType.PERSIST`、`CascadeType.MERGE`、`CascadeType.REMOVE`等。例如,如果我们设置了`CascadeType.ALL`,当保存或删除一个`Student`时,JPA会自动保存或删除所有相关的`...

    jpa to many

    @OneToMany(mappedBy = "parent", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) private List<ChildEntity> children; } @Entity public class ChildEntity { @Id @GeneratedValue(strategy = ...

    传智播客JPA学习笔记.pdf

    在JPA中,一对多关系通过@OneToMany和@ManyToOne注解定义,级联操作如CascadeType.PERSIST、CascadeType.REMOVE允许在操作父对象时自动处理子对象的状态。 **11. JPA中的一对多延迟加载与关系维护(一对多关系:二...

    10_传智播客JPA详解_JPA中的一对多双向关联与级联操作

    JPA提供了多种级联类型,如`CascadeType.PERSIST`、`CascadeType.MERGE`、`CascadeType.REMOVE`等。例如,如果设置为`CascadeType.ALL`,那么当保存一个班级实体时,它所关联的所有学生实体也会被自动保存;同样,...

    hibernate常见异常针对于jpa

    - `CascadeType.PERSIST`: 当父实体被保存时,所有关联的子实体也将被保存。 - `CascadeType.MERGE`: 当父实体被更新时,所有关联的子实体也将被合并更新。 - `CascadeType.REMOVE`: 当父实体被删除时,所有关联...

    spring jpa操作数据库 级联数据 hibernate

    例如,`@OneToMany`和`@ManyToOne`用于表示一对多或多对一的关系,级联操作如`CascadeType.PERSIST`、`CascadeType.MERGE`等可以确保当一个实体被保存或更新时,与其关联的实体也会相应更新。这在处理关联数据时非常...

    14_传智播客JPA详解_JPA中的多对多双向关联的各项关系操作

    3. ** Cascade操作**:`@ManyToMany`支持级联操作,如`CascadeType.PERSIST`、`CascadeType.MERGE`等,这使得在保存或更新主侧实体时,关联的次侧实体也会相应处理。 4. **Fetch策略**:默认情况下,JPA使用懒加载...

    JPA中的一对多双向关联与级联操作

    级联操作不仅可以应用于删除,还可以应用于其他操作,如`PERSIST`(保存)、`MERGE`(合并)、`REFRESH`(刷新)和`DETACH`(分离)。选择哪种级联类型取决于业务需求,需要注意的是过度使用级联可能会导致不必要的...

    实体Bean之间的级联关系

    实体Bean之间的级联关系是Java持久化框架如Hibernate或JPA中的一个重要概念,它涉及到对象关系映射(ORM)中的数据操作同步性。在数据库中,实体Bean通常代表表中的行,而实体间的级联关系则反映了表之间的关联。...

    hibernate课件

    常见的级联类型有:`CascadeType.ALL`、`CascadeType.PERSIST`、`CascadeType.MERGE`等。 6. **HQL与Criteria查询** HQL是Hibernate特有的面向对象的查询语言,类似于SQL,但更接近Java语法。Criteria查询则是通过...

    14_JPA详解_JPA中的多对多双向关联的各项关系操作.zip

    JPA的`CascadeType`可以设置为不同的值,比如`PERSIST`, `MERGE`, `REMOVE`等,以控制关联实体的生命周期。例如,如果希望当删除学生时,自动删除所有关联的课程,可以在`@ManyToMany`上添加`cascade = CascadeType....

    jpa--9.单向多对一

    - 要保存或更新Employee,我们可以直接调用`EntityManager`的`persist()`或`merge()`方法,JPA会处理外键的设置。 - 读取Employee时,可以直接访问`department`属性获取对应的Department实例。 4. **懒加载与即时...

    JPA中的一对一双向关联

    entityManager.persist(parent); ``` 四、优点与注意事项 一对一双向关联可以方便地从两个实体的任何一方访问对方,简化了代码。然而,它也增加了数据冗余和维护复杂性,因为每个实体都需要维护对另一方的引用。在...

    spring 使用 Jpa的笔记

    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST}) @JoinColumn(name = "dept_id") private Dept dept; } ``` 在这个例子中,`User`类与`Dept`类之间建立了多对一的关系。通过`@ManyToOne`...

    JPA基础语法资料--JPA_Basic

    JPA支持懒加载和级联操作,比如在上述用户和订单的例子中,可以通过设置`mappedBy`属性实现懒加载,而级联操作如`CascadeType.ALL`可以在操作用户时同时处理关联的订单。 9. **实体状态管理** JPA定义了四种实体...

    oneToMany.rar

    - 使用`cascade`属性,可以配置级联操作,如`CascadeType.PERSIST`会使得在保存用户时同时保存所有关联的订单。 6. **集合类型的选择**: - `OneToMany`关系通常与`List`, `Set`等集合类型一起使用。选择哪种类型...

    SpringData+jpa一对一与一对多

    cascade 属性用于配置级联操作,包括 ALL、PERSIST、MERGE、REMOVE 和 REFRESH 等取值。根据需求选择合适的级联操作。 在 School 和 Address 中,我们可以使用 @OneToOne(cascade = CascadeType.ALL) 来维护一对一...

    JavaEE 第8次

    @OneToMany(mappedBy = "department", cascade = CascadeType.ALL) private List<Employee> employees; // getters and setters } ``` Employee.java ```java @Entity public class Employee { @Id @...

Global site tag (gtag.js) - Google Analytics