#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:
Нашел проблему. Генератор последовательностей конфликтовал с тестовыми данными, поэтому он попытался дать новому пользователю идентификатор, который уже есть в базе данных