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 的关系的主要内容,如果未能解决你的问题,请参考以下文章
通过未标记为 cascade PERSIST 的关系找到了一个新对象