- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果这是一个愚蠢的问题,请原谅,但我对 JPA 和 Spring 非常陌生。我想知道是否有人可以帮助解决以下问题,因为我在 StackOverflow 和 google 上进行了大量搜索,但找不到适合我的用例的任何示例。可能是我缺少关键字,因为我不知道这种映射在 JPA 中被称为什么。
所以基本上,我正在尝试开发一个 REST API 来从数据库中检索和插入记录,为此我有两个表,即 CLIENT_MASTER
和 TITLE
。
CLIENT_MASTER
的架构如下所示,
CREATE TABLE CLIENT_MASTER (
ID INT GENERATED BY DEFAULT AS IDENTITY(START WITH 1000),
TITLE_ID INT,
FIRST_NAME VARCHAR(255),
MIDDLE_NAME VARCHAR(255),
LAST_NAME VARCHAR(255),
PRIMARY KEY (ID)
);
类似地,TITLE
表的方案是,
CREATE TABLE TITLE (
ID INT GENERATED BY DEFAULT AS IDENTITY,
TITLE VARCHAR(10),
PRIMARY KEY (ID)
);
CLIENT_MASTER
表具有以下外键约束,
ALTER TABLE CLIENT_MASTER ADD CONSTRAINT TITLE_ID FOREIGN KEY (TITLE_ID) REFERENCES TITLE;
两个表的实体定义如下,
import java.io.Serializable;
...
import lombok.Setter;
@Entity
@Table(name = "CLIENT_MASTER")
@Getter
@Setter
public class ClientMaster implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID", updatable = false, nullable = false)
private Integer id;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "TITLE_ID")
private Title title;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "MIDDLE_NAME")
private String middleName;
@Column(name = "LAST_NAME")
private String lastName;
}
import java.io.Serializable;
....
import lombok.Setter;
@Entity
@Table(name = "TITLE")
@Getter
@Setter
public class Title implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID", updatable = false, nullable = false)
private Integer id;
@Column(name = "TITLE")
private String title;
}
在我的休息 Controller 中,我需要在下面插入新客户端
@RequestMapping(method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value = HttpStatus.OK)
public ResponseEntity<?> create(@RequestBody ClientMaster cm) {
cmrepository.create(cm);
HttpHeaders headers = new HttpHeaders();
ControllerLinkBuilder linkBuilder = linkTo(methodOn(CompanyController.class).get(cm.getId()));
headers.setLocation(linkBuilder.toUri());
return new ResponseEntity<>(headers, HttpStatus.CREATED);
}
其中 cmrepository
是以下实例,
@Repository
public class CMRepository {
@PersistenceContext
private EntityManager entityManager;
@Override
public void create(ClientMaster cm) {
entityManager.persist(cm);
}
}
我在 post 请求中发送以下 json,我想要的是将标题值映射到 TITLE
表中的相应 id,并插入具有正确标题 id 的记录。
{
"title": {
"title": "Mr"
},
"firstName": "XXX",
"middleName": "YYY",
"lastName": "ZZZ",
}
通过上述内容,当前的行为是,对于 CLIENT_TABLE
中插入的每条记录,都会在 TITLE
表中创建一条新记录,这不是我想要的。
有人可以为我指出正确的方向,说明如何实现这一目标吗?
非常感谢。
最佳答案
持久性提供程序无法通过字段值本身自动假定 id。
你必须:
title
获取Title
条目。ClientMaster
上设置 title
。否则不执行任何操作,并允许级联保留该值。在 ClientMaster
对象上使用 merge
而不是 persist
:
cmrepository.merge(cm);
关于java - JPA+ Spring : Mapping a foreign key column to a ID based on the value received before persisting the entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55593186/
我是一名优秀的程序员,十分优秀!