我在数据库表中具有以下实体及其关系。
实体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);
}
}
}
是的,如果要引用现有实体,正确的做法是从EntityManager
提取实体,或者因为您正在使用存储库中的Spring Data JPA。
为了获得要使用JpaRepository.getOne
的实例,该实例使用JpaRepository.getOne
,因此无法访问数据库。
请注意,代码中的映射似乎也与描述不匹配。似乎关系EntityManager.getReference
应该标记为EntityManager.getReference
。