Задать вопрос
piatachki
@piatachki

Почему CrudRepository#save() выкидывает duplicate entry?

В процессе изучения темы, столкнулся с проблемой. Есть CrudRepository и вот такой VersionedEntity:
@Entity
@Table(name = "version_table")
public class VersionedEntity {

    @Id
    @Column(name = "id")
    private int id;

    @Column(name = "first_field")
    private String firstField;

    @Column(name = "second_field")
    private String secondField;

    public VersionedEntity() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstField() {
        return firstField;
    }

    public void setFirstField(String firstField) {
        this.firstField = firstField;
    }

    public String getSecondField() {
        return secondField;
    }

    public void setSecondField(String secondField) {
        this.secondField = secondField;
    }

    @Override
    public boolean equals(Object obj) {
        return obj instanceof EntityRepository && ((VersionedEntity) obj).id == this.id;
    }
}


Почему код:

public static void main(String[] args) {

        ApplicationContext ctx = SpringApplication.run(Application.class, args);
        EntityRepository repository = (EntityRepository) ctx.getBean("entityRepository");

        VersionedEntity entity = repository.findOne(0);
        entity.setFirstField("ffsv");

        repository.save(entity);

    }


вызывает ошибку "Duplicate entry '0' for key 'PRIMARY'"? Вроде бы метод должен проверять наличие объекта с данным id в таблице и в случае наличия делать update. По крайней мере всегда такие фокусы проходили. Тут всю голову сломал. Либо что-то недопонимаю.

Спасибо.
  • Вопрос задан
  • 539 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
jaxtr
@jaxtr
JavaEE/Spring-разработчик
Для id должна быть объявлена аннотация @GeneratedValue:
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы