弹簧数据 JPA 不会正确保存实体,除非设置了对其他实体的引用



如果我使用一个新的defaultAssetId使用JPA存储库保存这个实体,如果我设置defaultAsset,它只会将defaultAsssetId更新为新的值。我希望能够保存而不设置defaultAsset。

同样的问题适用于taskType和assetRole。

package au.com.polonious.conf.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
@Entity
public class TaskTypeAssetRole implements Serializable {
@GenericGenerator(name="tasktypeassetroleidseq", 
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "tasktypeassetroleidseq"),
@Parameter(name = "initial_value", value = "1"),
@Parameter(name = "increment_size", value = "1")
})

@Id 
@GeneratedValue(generator = "tasktypeassetroleidseq")
private Long id;

@Column(insertable = false, updatable=false)
private Long taskTypeId;
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="tasktypeid")
private TaskType taskType;

@Column(insertable = false, updatable=false)
private Long assetRoleId;
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="assetRoleId")
private Role assetRole;

@Column(insertable = false, updatable=false)
private Long defaultAssetId;
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="defaultassetid")
private Asset defaultAsset;

private Date startDate;
private Date endDate;
private String notes;

public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getTaskTypeId() {
return taskTypeId;
}
public void setTaskTypeId(Long taskTypeId) {
this.taskTypeId = taskTypeId;
}
public TaskType getTaskType() {
return taskType;
}
public void setTaskType(TaskType taskType) {
this.taskType = taskType;
}
public Long getAssetRoleId() {
return assetRoleId;
}
public void setAssetRoleId(Long assetRoleId) {
this.assetRoleId = assetRoleId;
}
public Role getAssetRole() {
return assetRole;
}
public void setAssetRole(Role assetRole) {
this.assetRole = assetRole;
}
public Long getDefaultAssetId() {
return defaultAssetId;
}
public void setDefaultAssetId(Long defaultAssetId) {
this.defaultAssetId = defaultAssetId;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
}

我尝试用新的defaultAssedId保存taskTypeAssetRole,而不设置defaultAsset,我期望数据库中该条目的defaultAssedId得到更新。最终发生的是defaultAssetId没有改变,尽管条目中的其他内容都成功更新并且没有错误。

您的映射本质上是坏的。列defaultassetiId映射到两个不同的值:字段defaultAssetIddefaultAsset的id

您应该删除defaultAssetId,因为该构造可能会在JPA提供程序的任何更新上中断。

您可以使用引用而不是完整实体来设置参考值,而无需从数据库加载实体。见https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html # getReferenceById-ID -

如果你不遵循这个建议,你应该删除updatable=false,如果你想更新一个字段。

最新更新