I have 3 tables with 1:N relations, something like:
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
...
)
And entities for them:
@Entity
@Table(name="tbl1")
public class Ent1 implements Serializable {
...
@OneToMany(mappedBy = "ent1", fetch = FetchType.LAZY,
cascade = CascadeType.ALL, orphanRemoval = true)
private List<Ent2> 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> 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;
...
}
The problem is, that I have the code that does some “import” by retrieving data from some external source and inserting it in these tables. Before importing I delete data from all three tables, then insert new, like this:
ent3Repository.deleteAll(); // Added that because of a problem
ent2Repository.deleteAll(); // Added that because of a problem
ent1Repository.deleteAll();
...
Ent1 ent1=new Ent1();
// Set ent1 fields here
ent1Repository.save();
Then, if tbl1 contains data, like a row with the name=’name1′, when I try to persist an entity, I’m getting an exception that unique constraint violated for the field “name”. Like, data weren’t deleted. But, if I do ent1Repository.count()
(which I did for checking) it returns 0 and (the most weird for me) insertion is working then.
Please help – I probably don’t understand something simple. Why it is working this way? How and why calling count() helps?
Thank you!