2016-12-26 66 views
0

在保存与外键关系的数据时,它抛出异常在有外键关系保存数据时,它抛出异常

灵敏度实体类

@Entity 
@Table(name="lab_tb_sensitivity") 
public class Sensitivity implements Serializable { 
    private static final long serialVersionUID = 1L; 


    @Id 
    @SequenceGenerator(name=EntityConstants.SQ_NAME, sequenceName=EntityConstants.SQ_SS) 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator=EntityConstants.SQ__NAME) 
    @Column(name="sensitivity_id") 
    private long sensitivityId; 

    @Column(name="audit_yn") 
    private String auditYn; 



    //bi-directional many-to-one association to SensitivityPattern 
    @OneToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE},fetch = FetchType.LAZY, mappedBy="sensitivity") 
    private Set<SensitivityPattern> SensitivityPattern; 

    /** Constructor and getters and setters 

} 

有一个一对多的关系附带SensitivityPattern

SensitivityPattern实体类

@Entity 
@Table(name="lab_tb_sensitivity_pattern") 
public class SensitivityPattern implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private SensitivityPatternPK id; 

    private String remarks; 

    @ManyToOne 
    @JoinColumn(name="sensitivity_id", nullable = false, insertable = false, updatable = false) 
    private Sensitivity sensitivity; 

    /**Constructor and geets setters */ 

} 

主键是复合键(sensitivityId + ABID) SensitivityPatternPK实体类 ---------------------------------

@Embeddable 
public class SensitivityPatternPK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    @Column(name="sensitivity_id") 
    private long sensitivityId; 

    @Column(name="ab_id") 
    private long abId; 


    /**Constructor and geets setters */ 

} 

在保存代码

@Override 
public boolean saveSensitivityData(List<SensitivityDto> sensitivity) { 

    if(sensitivity != null){ 

     for(SensitivityDto dto : sensitivity) { 
      try { 
       updateSensitivityPattern(dto); 
       super.saveOneEntity(dto); 
      } catch (GenericException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return false; 
} 

/** 
* To update the sensitivity data. 
* @param dto 
*/ 
private void updateSensitivityPattern(SensitivityDto dto) { 
    if(dto != null && dto.getSensitivityPattern() != null){ 
     for(SensitivityPatternDto sPattern : dto.getSensitivityPattern() ){ 
      SensitivityPatternPKDto sensitivityPatternPKDto = new SensitivityPatternPKDto(); 
      sensitivityPatternPKDto.setSensitivityId(dto.getSensitivityId()); 
      sPattern.setId(sensitivityPatternPKDto); 
      sPattern.setSensitivity(dto); 
     } 
} 

这是DAO类将数据保存到数据库中

@Transactional(rollbackOn = GenericException.class) 
public D saveOneEntity(D dto) throws GenericException { 
    T result; 
    try { 
     result = repository.save(mapper.map(dto, entityClass)); 
    } catch (DataAccessException dae) { 
     throw new GenericException(dae, dae.getRootCause().getMessage()); 
    } catch (Exception e) { 
     throw new GenericException(
       e, 
       messageSource.getMessage(CodeEnum.UNKNOWN_EXCEPTION_ON_SAVE_METHOD.getValue(), null, Locale.ENGLISH)); 
    } 
    return mapper.map(result, dtoClass); 
} 

在与下面的数据保存在击中下面的数据服务

{ 
     "sensitivity": [ 
     { 
      "auditYn": "Y", 
      "sensitivityPattern": [ 
      { 
       "id": { 
       "abId": 11 
       }, 
       "remarks": "test" 
      } 
      ] 
     } 
     ] 
    } 

它抛出异常

"Caused by: org.postgresql.util.PSQLException: ERROR: insert or update on table "lab_tb_sensitivity_pattern" violates foreign key constraint "fk_sensitivity_id" Detail: Key (sensitivity_id)=(0) is not present in table "lab_tb_sensitivity".

回答

2

请修复下面的代码,

try { 
     updateSensitivityPattern(dto); 
     super.saveOneEntity(dto); 
    } 
catch (GenericException e) { 
      e.printStackTrace(); 
    } 

您需要persist第一Sensitivity然后SensitivityPattern。 目前,它失败,因为没有这样的entity发现,因此没有产生id

相反做,

try { 
     //please verify as per you code 
     CorrespondingSentivityDTO persistedDTO = super.saveOneEntity(dto); 
     updateSensitivityPattern(persistedDTO); 
} 
catch (GenericException e) { 
      e.printStackTrace(); 
} 
+0

SensitivityDto persistedDTO = super.saveOneEntity(DTO); //这条线现在抛出异常 – user630209

+0

@ user630209什么是异常? – ScanQR

+0

造成的:org.postgresql.util.PSQLException:ERROR:插入或表 “lab_tb_sensitivity_pattern” 更新违反外键约束 “fk_sensitivity_id” 详细信息:按键(sensitivity_id)=(0)不存在表 “lab_tb_sensitivity”。 – user630209