gpt4 book ai didi

java - hibernate一对多自动添加子对象异常

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:42 27 4
gpt4 key购买 nike

下面是我的两个具有一对多和多对一关系的实体类。

Parent AuditMst:

public class AuditMst implements Serializable {


/*@Id
@Column(name="AUDIT_ID")
private String auditId;*/

@Id
@Column(name="AUDIT_ID")
@GeneratedValue(strategy=GenerationType.AUTO)
private long auditId;

private String action;

@Column(name="DATE_TIME")
private Timestamp dateTime;

//bi-directional many-to-one association to AuditDetail
@OneToMany(mappedBy = "auditMst", cascade = {CascadeType.ALL })
private List<AuditDetail> auditDetails;

Child entity: Audit Details

public class AuditDetail implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@Column(name="ID")
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;

@Column(name="FIELD_NAME")
private String fieldName;

//bi-directional many-to-one association to AuditMst
@ManyToOne
@JoinColumns({
@JoinColumn(name = "AUDIT_ID", referencedColumnName = "AUDIT_ID")})
private AuditMst auditMst;

当我尝试添加保存审核 mst 和审核详细信息列表时,hibernate 给出了异常:

o.h.engine.jdbc.spi.SqlExceptionHelper : Column 'AUDIT_ID' cannot be null

这是一对多的关系。我正在使用 spring data jpa 和 hibernate。

在我的审核监听器中:

AuditMst auditMst = new AuditMst();
auditMst.setAction("add");
for(Object propNameObject : map.keySet()){
AuditDetail auditDetail = new AuditDetail();
String propertyName = (String) propNameObject;
Object property1 = propUtils.getProperty(oldObject, propertyName);
Object property2 = propUtils.getProperty(newObject, propertyName);
auditDetail.setFieldName(propertyName);
auditDetail.setOldValue(property1.toString());
auditDetail.setNewValue(property2.toString);
auditDetailList.add(auditDetail);
}
auditMst.setAuditDetails(auditDetailList);
auditMstService.addAuditMst(auditMst);


ServiceImpl:

@Transactional
public AuditMst addAuditMst(AuditMst auditMst){
AuditMst savedAuditMst = auditMstRepository.save(auditMst);
}

最佳答案

您有多对一关系,然后在 AuditDetail 中将 ManyToOne 更改为:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "AUDIT_ID")
private AuditMst auditMst;

但请确保您在与实体 AuditDetail 相关的表中创建了 AUDIT_ID 列。并且由于是级联关系,所以只保存AuditMst对象

在你的java代码中:

AuditMst auditMst = new AuditMst();
auditMst.setAction("add");
for(Object propNameObject : map.keySet()){
AuditDetail auditDetail = new AuditDetail();
String propertyName = (String) propNameObject;
Object property1 = propUtils.getProperty(oldObject, propertyName);
Object property2 = propUtils.getProperty(newObject, propertyName);
auditDetail.setFieldName(propertyName);
auditDetail.setOldValue(property1.toString());
auditDetail.setNewValue(property2.toString);
//Here you need to add the original object to make work the on cascade.
auditDetail.setAuditMst(auditMst);
auditDetailList.add(auditDetail);
}

关于java - hibernate一对多自动添加子对象异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37675371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com