JPA ManyToOne с проблемой сохранения репозитория

#java #spring-boot #spring-data-jpa

#Ява #пружинный ботинок #весна-данные-jpa

Вопрос:

В моем UserService я вызываю save метод для нового пользователя, и createdBy он будет установлен и сохранен. При вызове сохранения возникает следующая ошибка:

 org.springframework.dao.DataIntegrityViolationException: A different object with the same identifier value was already associated with the session : [at.qe.skeleton.model.User#1];  

Похоже, он пытается сохранить User объект (который уже существует в базе данных), для которого задано createdBy значение . Я пробовал различные типы каскадов в аннотации Manytoon, но это не работает. Может быть, у меня есть какая-то другая неправильная аннотация, но я не знаю, что именно.

У меня есть следующие занятия:

DBEntity.java

 @MappedSuperclass public class DBEntity implements Persistablelt;Longgt;, Serializable, Comparablelt;DBEntitygt; {   private static final long serialVersionUID = 1L;   @Id  @GeneratedValue(  strategy = GenerationType.SEQUENCE,  generator = "default_generator"  )  private Long id;   @ManyToOne()  @JoinColumn(  name = "created_by",  referencedColumnName = "id",  insertable = false,  updatable = false,  foreignKey = @ForeignKey(  name = "created_by_user_id_fk"  )  )  private User createdBy;   @Column(  name = "created_on",  nullable = false,  columnDefinition = "TIMESTAMP WITHOUT TIME ZONE"  )  private Date createdOn;  //shortened  }  

User.java

 @Entity(name = "User") @Table(  name = ""user"",  uniqueConstraints = {  @UniqueConstraint(name = "user_username_unique", columnNames = "username")  } ) @SequenceGenerator(  name = "default_generator",  sequenceName = "user_role_sequence",  allocationSize = 1 ) public class User extends DBEntity {   @Column(  name = "username",  nullable = false,  columnDefinition = "TEXT"  )  private String username;  //shortened  }  

UserService.java

 public class UserService {   @Autowired  private UserRepository userRepository;  public User saveUser(User user) {  if (user.isNew()) {  user.setCreatedOn(new Date());  user.setCreatedBy(getAuthenticatedUser());  } else {  user.setUpdatedOn(new Date());  user.setUpdatedBy(getAuthenticatedUser());  }   return userRepository.save(user);  }   private User getAuthenticatedUser() {  Authentication auth = SecurityContextHolder.getContext().getAuthentication();  return userRepository.findFirstByUsername(auth.getName());  } }  

UserRepository.java

 public interface UserRepository extends AbstractRepositorylt;User, Longgt; {}  

Ответ №1:

Нашел проблему. Генератор последовательностей конфликтовал с тестовыми данными, поэтому он попытался дать новому пользователю идентификатор, который уже есть в базе данных