Non uniquobjectexception при спасении вложенной сущностиJAVA

Программисты JAVA общаются здесь
Anonymous
Non uniquobjectexception при спасении вложенной сущности

Сообщение Anonymous »

Я пытался решить эту проблему в течение нескольких дней, но я не могу найти решение. Я пытаюсь проверить, как работает транзакция, это очень простой пример. Класс объектов: < /p>

Код: Выделить всё

public class BettingProgram {
@Id
private int id;

@Column(name = "name", nullable = false)
private String name;

@Column(name = "date", nullable = false)
private LocalDate date;

@JsonManagedReference
@OneToMany(mappedBy = "bettingProgram", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List events;
}

public class Event {
@EmbeddedId
private EventId eventId;

@JsonBackReference
@ManyToOne
@MapsId("idBettingProgram")
@JoinColumn(name = "idBettingProgram")
private BettingProgram bettingProgram;

@Column(name = "type", nullable = false)
private String type;

@Column(name = "name", nullable = false)
private String name;

@Column(name = "dateEvent", nullable = false)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime dateEvent;

@JsonManagedReference
@OneToMany(fetch = FetchType.LAZY, mappedBy = "event", cascade = CascadeType.ALL)
private List marketList;
}

public class Market {
@EmbeddedId
private MarketId marketId;

@JsonBackReference
@ManyToOne
@JoinColumns({
@JoinColumn(name = "idEvent", referencedColumnName = "idEvent"),
@JoinColumn(name = "idBettingProgram", referencedColumnName = "idBettingProgram")
})
@Valid
@MapsId("eventId")
private Event event;

@Column(name = "name", nullable = false)
private String name;

@Enumerated(EnumType.STRING)
@Column(name = "status", nullable = false)
private Status status;
}
< /code>
Это функции, которые управляют вставкой для каждого объекта: < /p>
public BettingProgramDTO createBettingProgramWithManualTransaction(BettingProgramDTO bettingProgramDTO) throws CustomException {
log.info("Betting program da creare : {}", bettingProgramDTO);
BettingProgram bettingProgramCreated = methodCreaBettingPAndEvent(bettingProgramDTO);
BettingProgramDTO bettingProgramDTOCreated = bettingProgramMapper.toDTO(bettingProgramCreated);
TransactionStatus txStatus = txManager.getTransaction(new DefaultTransactionDefinition());
try {
List marketDTOList = methodCreaMArketSelection(bettingProgramCreated.getEvents().getFirst(), bettingProgramDTO.getEvents().getFirst().getMarketList());

bettingProgramDTOCreated.getEvents().getFirst().setMarketList(marketDTOList);
} catch (Exception e) {
log.error("{}  Got an error:{}", LogUtil.errorLogString(), e.getMessage(), e);
txManager.rollback(txStatus);
}
txManager.commit();
return bettingProgramDTOCreated;
}

public BettingProgram methodCreaBettingPAndEvent(BettingProgramDTO bettingProgramDTO) throws CustomException {
Optional optBettingProgram = bettingProgramRepository.findById(bettingProgramDTO.getId());
if (optBettingProgram.isPresent()){
throw new NotValidFieldException("Betting program già esistente.");
}
BettingProgram bettingProgram = bettingProgramMapper.toEntityWithoutSon(bettingProgramDTO);
BettingProgram bettingProgramInserted = bettingProgramRepository.save(bettingProgram);

EventDTO eventDTO = bettingProgramDTO.getEvents().getFirst();
eventDTO.setIdBettingProgram(bettingProgramInserted.getId());
log.info("Event da creare : {}", eventDTO);
Event eventCreated = eventMapper.toEntityWithoutSon(eventServiceTransactional.createEventWithTransaction(eventDTO));
bettingProgramInserted.getEvents().add(eventCreated);

return bettingProgramInserted;
}

public List methodCreaMArketSelection(Event event, List marketDTO) throws CustomException {
List  marketDTOList = new ArrayList();
for (MarketDTO marketDTOToCreate : marketDTO){
marketDTOToCreate.setIdBettingProgram(event.getEventId().getIdBettingProgram());
marketDTOToCreate.setIdEvent(event.getEventId().getIdEvent());
log.info("Market dto da creare : {}", marketDTOToCreate);
MarketDTO marketDTOCreated = marketServiceTransactional.createMarketWithTransaction(event, marketDTOToCreate);
marketDTOList.add(marketDTOCreated);
}
return marketDTOList;
}
Когда я сохраняю рынок, у меня есть "org.springframework.dao.duplicatekeyexception: другой объект с той же значением идентификатора уже был связан с сеансом: [com.gestionebetbetoffer.model.event#evendid (idbettingprogram = 784, iDevent = 1726).>

Подробнее здесь: https://stackoverflow.com/questions/796 ... ted-entity

Вернуться в «JAVA»