Spring JPA: сохранение объекта, связанного с объектом, который является своего рода главной таблицей - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть следующие объекты и их отношения в таблицах базы данных.

Entity 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. Я хочу спросить: нужно ли явно извлекать Trans_TYPE_ID из главной таблицы (ONB_TRANS_TYPE) или мне не следует делать это 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);
            }
        }   

    }

1 Ответ

1 голос
/ 24 февраля 2020

Да, правильно, если вы хотите сослаться на существующую сущность, это извлечь ее из EntityManager или поскольку вы используете Spring Data JPA из хранилища.

Для получения экземпляра вы хотите использовать JpaRepository.getOne, который использует EntityManager.getReference и, следовательно, не имеет доступа к базе данных.

Обратите внимание, что отображение, которое вы имеете в коде, похоже, не соответствовать описанию. Кажется, отношение transactionType должно быть помечено как ManyToOne.

...