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
.
我在数据库 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
.