Spring JPA:保存一个实体,该实体与某种类型的主实体有关联 table

Spring JPA: Saving An entity having association with an entity which is sort of master table

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

实体 TransactionType 将包含一组永远不会 change/or 很少更改的主数据。

@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

}

另一个实体CandidateTransaction,它有一个来自TransactionType的外键,在table两个table之间的关系是正常的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。 我想问的是我是否必须明确地从 Master Table (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);
            }
        }   

    }

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

获取您要使用的实例JpaRepository.getOne which uses EntityManager.getReference,从而不访问数据库。

请注意,您在代码中的映射似乎与描述不符。似乎关系 transactionType 应该标记为 ManyToOne.