[英]JPA return full foreign key entity on Insert/Update
我的目标是能够在用户传递相关数据和外键ID的情况下插入以下对象,并向用户返回一个包含完整外键对象的完整对象,而不仅仅是外键密钥ID。
@Data
@Entity
@EqualsAndHashCode(callSuper = false)
@Table(name = MY_OBJECT_TABLE)
public class MyObject {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MY_OBJECT_ID", unique = true, nullable = false)
private Integer myObjectId;
@ManyToOne(targetEntity = ForeignObject.class, fetch = FetchType.EAGER)
@JoinColumn(name = "FOREIGN_OBJECT_ID", referencedColumnName = "FOREIGN_OBJECT_ID", nullable = false, insertable = false, updatable = false)
private ForeignObject foreignObject;
@Column(name = "FOREIGN_OBJECT_ID")
private Integer foreignObjectId;
@Column(name = "RANDOM_FIELD", nullable = false)
@NotNull
private Boolean randomField;
}
我尝试使用上面的方法,它会插入,但它只会在插入时返回foreignObjectId,而不是整个异物。
我尝试了以下方法使其正常工作,但没有运气。
@Transactional
public MyObject create(MyObject myObject) {
MyObject createdMyObject = this.myObjectRepository.save(myObject);
return createdMyObject;
}
并尝试了
@Transactional
public MyObject create(MyObject myObject) {
MyObject createdMyObject = this.myObjectRepository.save(myObject);
return this.myObjectRepository.findById(createdMyObject.getMyObjectId());
}
我不确定我的域对象中是否需要更改或是否需要以某种方式更改创建方法。
当前输出为:
{
"myObjectId": 1,
"foreignObject": null,
"foreignObjectId": 3,
"randomField": true
}
预期输出为:
{
"myObjectId": 1,
"foreignObject": {
"foreignObjectId": 3,
},
"foreignObjectId": 3, // I don't care if this field stays here or not
"randomField": true
}
问题是在以下情况下您破坏了域模型以尝试使其适合某些前端问题:
@ManyToOne(targetEntity = ForeignObject.class, fetch = FetchType.EAGER)
@JoinColumn(name = "FOREIGN_OBJECT_ID", referencedColumnName = "FOREIGN_OBJECT_ID",
nullable = false, insertable = false, updatable = false)
private ForeignObject foreignObject;
@Column(name = "FOREIGN_OBJECT_ID")
private Integer foreignObjectId;
您从不设置关系,而仅设置整数字段。
这不能作为对EntityManager#persist
的调用(通过myObjectRepository.save)仅将现有对象并使之持久化(即,不会触发设置对ForeignObject的引用)的调用。
@Transactional
public MyObject create(MyObject myObject) {
//createdMyObject and myObject are same instance
MyObject createdMyObject = this.myObjectRepository.save(myObject);
return createdMyObject;
}
这将不会像从同一实例(即您创建的没有设置关联关系的实例)那样简单地从Hibernate的一级缓存中检索:
@Transactional
public MyObject create(MyObject myObject) {
//createdMyObject, myObject and (due to 1st level cache)
//object returned from query are same
MyObject createdMyObject = this.myObjectRepository.save(myObject);
return this.myObjectRepository.findById(createdMyObject.getMyObjectId());
}
您可以通过执行以下操作使get方法2起作用, 但是正确的解决方案是删除Integer字段并正确设置关系。 Spring MVC控制器应使用{... "foreignObject" : 3 ...}
自动从POST / PUT请求中的ID设置引用{... "foreignObject" : 3 ...}
@PersistenceContect
EntityManager em;
@Transactional
public MyObject create(MyObject myObject) {
this.myObjectRepository.saveAndFlush(myObject);
em.clear(); //force reload from database
return this.myObjectRepository.findById(createdMyObject.getMyObjectId());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.