JpaRepository.deleteAll() не работает без вызова JpaRepository.count()JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 JpaRepository.deleteAll() не работает без вызова JpaRepository.count()

Сообщение Anonymous »

У меня есть 3 таблицы с отношениями 1:N, что-то вроде:

Код: Выделить всё

create table tbl1
(
id bigserial primary key
name varchar unique not null
...
);
create table tbl2
(
id bigserial primary key,
tbl1_id bigint not null,
constraint tbl2_1_fk foreign key(tbl1_id) references tbl1.id
...
);
create table tbl3
(
id bigserial primary key,
tbl2_id bigint not null,
constraint tbl3_2_fk foreign key(tbl2_id) references tbl2.id
...
)

И сущности для них:

Код: Выделить всё

@Entity
@Table(name="tbl1")
public class Ent1 implements Serializable {
...
@OneToMany(mappedBy = "ent1", fetch = FetchType.LAZY,
cascade = CascadeType.ALL, orphanRemoval = true)
private List ent2 = new ArrayList();
...
}

@Entity
@Table(name="tbl2")
public class Ent2 implements Serializable {
...
@OneToMany(mappedBy = "ent2", fetch = FetchType.LAZY,
cascade = CascadeType.ALL, orphanRemoval = true)
private List ent3 = new ArrayList();

@ManyToOne(fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name = "tbl1_id", nullable = false)
private Ent1 ent1;
...
}

@Entity
@Table(name="tbl3")
public class Ent3 implements Serializable {
...
@ManyToOne(fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name = "tbl2_id", nullable = false)
private Ent2 ent2;
...
}
Проблема в том, что у меня есть код, который выполняет некоторый «импорт», получая данные из какого-то внешнего источника и вставляя их в эти таблицы. Перед импортом я удаляю данные из всех трёх таблиц, затем вставляю новые, вот так:

Код: Выделить всё

@Transactional
public void someMethod() {
ent3Repository.deleteAll(); // Added that because of a problem
ent2Repository.deleteAll(); // Added that because of a problem
ent1Repository.deleteAll();
...
// ent1Repository.count();
...
Ent1 ent1=new Ent1();
// Set ent1 fields here
ent1Repository.save();
...
}
Но если таблица tbl1 содержит данные, например строку с именем name='name1', когда я пытаюсь сохранить объект с тем же именем, я получаю исключение, которое ограничивает уникальность нарушено для поля «имя». Мол, данные не удалились. Но если я вызову ent1Repository.count() сразу после удаления (что я и сделал для проверки), он вернет 0 и (самое странное для меня) вставка тогда работает без исключений.
Помогите, наверное, я чего-то простого не понимаю. Почему это работает таким образом? Как и почему помогает вызов count()?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/785 ... tory-count
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»