Spring JPA:正在保存与具有某种主表关系的实体有关联的实体

问题描述 投票:0回答:1

我在数据库表中具有以下实体及其关系。

实体TransactionType将包含一组主数据,这些主数据将永远不会更改/或很少会被更改。

@Entity
@Table(name="ONB_TRANS_TYPE")
@Cacheable(true)
public class TransactionType implements Serializable {

    private static final long serialVersionUID = -6630648311619744810L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer ID;

    @Column(name = "TRANS_TYPE_NAME",unique=true)
    private String transTypeName;

    //getters and setters

}

另一个Enitity CandidateTransaction,它具有TransactionType的外键,在表中,两个表之间的关系是正常的Pk-FK关系。

@Entity
@Table(name="ONB_CANDIDATE_TRANS")
public class CandidateTransaction implements Serializable{

    private static final long serialVersionUID = 3615632069112078119L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer ID;

    //FK to ONB_Candidate_Info table
    @Column(name="CANDIDATE_ID")
    private String candidateId;

    private UUID TRANS_IDENTIFIER;


    @OneToOne 
    @JoinColumn(name="TRANS_TYPE_ID")
    private TransactionTypeDTO transactionType;
}

我已经在两个实体之间进行了单向的OneToOneMapping。现在,当我要保留CandidateTransaction的对象时,我在保存时正在执行以下操作,并且抛出错误,指出您无法在TRANS_TYPE_ID中插入null。我想问的是我必须从主表(ONB_TRANS_TYPE)中显式获取Trans_TYPE_ID还是我不应该ORM这样做?正如我给的映射??

@Service
public class CandidateTransactionManagerImpl implements CandidateTransactionManager {

    @Autowired
    private CandidateTransactionRepository candidateTransactionRepository;

    @Autowired
    private TransactionTypeRepository transactionTypeRepository;

    @Override
    public void saveTransactionProgress(String candidateId,CandidateProgressRequestBO candidateProgressRequestBO) throws ONBException {

        CandidateTransaction savedInstance = new CandidateTransaction();

        TransactionType transactionType ;

        CandidateTransaction candidate;
        if(CollectionUtils.isEmpty(candidateProgressRequestBO.getStepStatus()))
            throw new ONBException("No Transaaction to Save! Transaction Object Empty",new Exception());
        else {
            for(CandidateProgressBO candidateProgress : candidateProgressRequestBO.getStepStatus()) {
                transactionType = new TransactionType();

                candidate = new CandidateTransaction();
                candidate.setCandidateId(candidateId);

                transactionType.setTransTypeName(candidateProgress.getStep().name());

                candidate.setTransactionType(transactionType);
                candidate.setMODIFIED_DATE(new Date());
                savedInstance = candidateTransactionRepository.save(candidate);

                System.out.println("Saved Isntance "+savedInstance);
            }
        }   

    }
hibernate jpa spring-data-jpa mapping persist
1个回答
1
投票

是的,如果要引用现有实体,正确的做法是从EntityManager提取实体,或者因为您正在使用存储库中的Spring Data JPA。

为了获得要使用JpaRepository.getOne的实例,该实例使用JpaRepository.getOne,因此无法访问数据库。

请注意,代码中的映射似乎也与描述不匹配。似乎关系EntityManager.getReference应该标记为EntityManager.getReference

© www.soinside.com 2019 - 2024. All rights reserved.