JPA 错误未标记级联 PERSIST 的关系

Posted

技术标签:

【中文标题】JPA 错误未标记级联 PERSIST 的关系【英文标题】:JPA Error a relationship that was not marked cascade PERSIST 【发布时间】:2021-09-22 23:25:52 【问题描述】:

我有一个名为 State (of a Country) 的表和 JPA 实体,通过 JPA,我正在尝试为用户(实体)编写代码以在网站上注册。显然,用户和状态之间存在一对一的关系(一个用户只属于一个状态)。这是我的代码:

@Entity
@Table(name = "STATE")
public class State implements Serializable 
    
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private int id;
    
    
    @Column(name = "CODE")
    private String code;
    
    @Column(name="NAME")
    private String name;

用户代码如下:

@Entity
@Table(name = "USER")
public class User implements Serializable 

....
@OneToOne()
    @JoinColumn(name = "STATE_ID", referencedColumnName = "ID")
    private State state;

数据库表如下:

CREATE TABLE IF NOT EXISTS `bjm`.`STATE` (
  `CODE` CHAR(2) NOT NULL,
  `NAME` VARCHAR(40) NOT NULL,
  `POST_CODE_PREFIX` VARCHAR(10) NULL,
  `LANG` CHAR(2) NOT NULL,
  `ID` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`ID`))
ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS `bjm`.`USER` (
  `ID` INT NOT NULL AUTO_INCREMENT,
  `FIRSTNAME` VARCHAR(45) NOT NULL,
  `LASTNAME` VARCHAR(45) NOT NULL,
  `EMAIL` VARCHAR(50) NOT NULL,
  ....
  PRIMARY KEY (`ID`),
  CONSTRAINT `fk_USER_STATE1`
    FOREIGN KEY (`STATE_ID`)
    REFERENCES `bjm`.`STATE` (`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
 )
ENGINE = InnoDB;

但是,当我尝试在我的 JSF2 应用程序中创建/注册用户时,我收到以下错误:

java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: org.bjm.model.State

我不想在数据库中创建新的状态记录。它们已经存在(作为参考数据),只需要通过外键分配给用户。

可能是我遗漏了什么,但我需要一个解决方案。任何建设性的意见都会有极大的帮助。

谢谢

【问题讨论】:

【参考方案1】:

显然,User 和 State 之间是一对一的关系(一个 User 只属于一个 State)

好吧,显然这是错误。这是经典的@ManyToOne,因为许多用户来自同一个州。它应该是这样的:

@Entity
@Table
public class User implements Serializable 

    // (...)
    @ManyToOne
    @JoinColumn(name = "STATE_ID")
    private State state;

【讨论】:

以上是关于JPA 错误未标记级联 PERSIST 的关系的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate JPA 关联关系

通过未标记为 cascade PERSIST 的关系找到了一个新对象

JPA 级联持续错误

jpa级联删除的问题

你好! jpa里不能级联删除。我看你在百度知道里已经解决了这个问题。请问,是怎么解决的!谢谢

JPA+Hibernate - 实体关系中的循环 - 级联策略