2016-06-07 53 views
1

以下是我的两个实体类,它们具有一对多和多对一的关系。休眠一对多自动添加子对象异常

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和审计内容目录休眠使我异常:

ohengine.jdbc.spi.SqlExceptionHelper:列“AUDIT_ID”不能为空

这是一对多的关系。我正在使用spring数据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); 
} 

回答

0

你有多对一的关系,那么在你AuditDetail你多对一更改为:

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

但可以肯定你在创建列AUDIT_ID该表与实体AuditDetail相关。而作为关系是级联,保存对象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); 
} 
+0

@jack你从命运表有FK,audit_detail?你使用的代码是一样的吗?你能添加异常的完整堆栈跟踪吗? – cralfaro

+0

你可以添加一段代码来创建这些实体并保存它们吗? – cralfaro

+0

请使其可读性增加到您的原始问题。 – cralfaro