Skip to main content
Stack Overflow
  1. About
  2. For Teams

Return to Question

Trim chat
Source Link
halfer
  • 20.2k
  • 20
  • 111
  • 208

i tried to solve this problem for days, I can't find a solution. I'm trying to test how transaction works, it's a very simple example.

Hope someoneHow can help me.I resolve this?

i tried to solve this problem for days, I can't find a solution. I'm trying to test how transaction works, it's a very simple example.

Hope someone can help me.

I'm trying to test how transaction works, it's a very simple example.

How can I resolve this?

Code formatted
Source Link

i tried to solve this problem for days, but iI can't find a solution. I'm trying to test how transaction works, it's a very simple example.

Entity class:

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<Event> 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<Market> 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;
}
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<Event> 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<Market> 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;
}
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<MarketDTO> 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<BettingProgram> 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<MarketDTO> methodCreaMArketSelection(Event event, List<MarketDTO> marketDTO) throws CustomException {
 List<MarketDTO> 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;
}
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<MarketDTO> 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<BettingProgram> 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<MarketDTO> methodCreaMArketSelection(Event event, List<MarketDTO> marketDTO) throws CustomException {
 List<MarketDTO> 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;
}

When iI save market i have "org.springframework.dao.DuplicateKeyException: A different object with the same identifier value was already associated with the session: [com.gestionebettingoffer.model.Event#EventId(idBettingProgram=784, idEvent=1726)].I have

org.springframework.dao.DuplicateKeyException: A different object with the same identifier value was already associated with the session: [com.gestionebettingoffer.model.Event#EventId(idBettingProgram=784, idEvent=1726)].

Hope someone can help me.

i tried to solve this problem for days, but i can't find a solution. I'm trying to test how transaction works, it's a very simple example. Entity class:

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<Event> 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<Market> 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;
}
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<MarketDTO> 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<BettingProgram> 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<MarketDTO> methodCreaMArketSelection(Event event, List<MarketDTO> marketDTO) throws CustomException {
 List<MarketDTO> 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;
}

When i save market i have "org.springframework.dao.DuplicateKeyException: A different object with the same identifier value was already associated with the session: [com.gestionebettingoffer.model.Event#EventId(idBettingProgram=784, idEvent=1726)]. Hope someone can help me.

i tried to solve this problem for days, I can't find a solution. I'm trying to test how transaction works, it's a very simple example.

Entity class:

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<Event> 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<Market> 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;
}
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<MarketDTO> 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<BettingProgram> 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<MarketDTO> methodCreaMArketSelection(Event event, List<MarketDTO> marketDTO) throws CustomException {
 List<MarketDTO> 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;
}

When I save market, I have

org.springframework.dao.DuplicateKeyException: A different object with the same identifier value was already associated with the session: [com.gestionebettingoffer.model.Event#EventId(idBettingProgram=784, idEvent=1726)].

Hope someone can help me.

Source Link
rux
  • 11
  • 2

NonUniqueObjectException when save nested entity

i tried to solve this problem for days, but i can't find a solution. I'm trying to test how transaction works, it's a very simple example. Entity class :

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<Event> 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<Market> 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;
}

These are the functions that manage insert for each entity:

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<MarketDTO> 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<BettingProgram> 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<MarketDTO> methodCreaMArketSelection(Event event, List<MarketDTO> marketDTO) throws CustomException {
 List<MarketDTO> 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;
}

When i save market i have "org.springframework.dao.DuplicateKeyException: A different object with the same identifier value was already associated with the session: [com.gestionebettingoffer.model.Event#EventId(idBettingProgram=784, idEvent=1726)]. Hope someone can help me.

lang-java

AltStyle によって変換されたページ (->オリジナル) /