JPA ManyToOne存在存储库保存问题



在我的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];

看起来它试图保存设置为createdByUser对象(该对象已存在于数据库中(。我在ManyToOne注释中尝试了各种级联类型,但都不起作用。也许我有其他注释错误,但我不知道是什么。

我有以下类:

DBEntity.java

@MappedSuperclass
public class DBEntity implements Persistable<Long>, Serializable, Comparable<DBEntity> {
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 AbstractRepository<User, Long> {}

发现问题。序列生成器与测试数据冲突,因此它试图给新用户一个已经在数据库中的id

最新更新