【问题标题】:hibernate one to many adding child object automatically exception休眠一对多自动添加子对象异常
【发布时间】:2016-10-07 02:53:20
【问题描述】:

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

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 和审核详细信息列表时,休眠给了我异常:

o.h.engine.jdbc.spi.SqlExceptionHelper:列“AUDIT_ID”不能为空

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

在我的审计Listner中:

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);
}

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    您有一个多对一的关系,然后在 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);
    }
    

    【讨论】:

    • @jack 你有来自命运表的 FK,audit_detail 吗?你使用的代码是一样的吗?您可以添加异常的完整堆栈跟踪吗?
    • 你能在你创建这些实体的地方添加一段代码并保存它们吗?
    • 我想看到的是如何创建对象 AuditMst 以及如何将详细信息添加到列表中。请用那段代码更新您的问题,我认为问题可能出在那儿
    • 我已经添加了您要查找的代码。
    • 您能否在创建 AuditMst 实体的位置添加代码块并在原始问题中添加 AuditDetail?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2014-12-14
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多