jpa级联操作详解1-级联保存(CascadeType.PERSIST)

运行以上save()方法之后,数据库中只对应的表,但是只有garage表中被存入了数据,而auto表中没有被存入数据,仅仅是生成了表而已。 数据库中的表数据: +—–+———–+ | gid | garagenum | +—–+———–+ | 1 | room1 | +—–+———–+

mysql> select * from auto; Empty set (0.00 sec) 这儿可以注意到虽然生成了auto数据库表,但是无法存储有关auto的数据,因为没有先保存auto或设置级联保存 观察发出的sql语句: Hibernate: insert into Garage (garagenum) values (?)

(二)先保存auto 将junit测试类中的save方法改为

@Test public void save() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-hibernate");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();

Garage garage = new Garage();
garage.setGaragenum("room1");

Auto auto1 = new Auto();
auto1.setAutonum("bj0000");
auto1.setAutotype("car");

Auto auto2 = new Auto();
auto2.setAutonum("bj1231");
auto2.setAutotype("bus");

garage.addGarageAuto(auto1);
garage.addGarageAuto(auto2);
em.persist(auto1);
em.persist(auto2);
em.persist(garage);
em.getTransaction().commit();
em.close();
factory.close();
}

观察发出的sql语句: Hibernate: insert into Auto (autonum, autotype, garageid) values (?, ?, ?) Hibernate: insert into Auto (autonum, autotype, garageid) values (?, ?, ?) Hibernate: insert into Garage (garagenum) values (?) Hibernate: update Auto set autonum=?, autotype=?, garageid=? where autoId=? Hibernate: update Auto set autonum=?, autotype=?, garageid=? where autoId=? 当然也生成了对应的数据记录,但是对数据库进行了5次操作

mysql> select * from garage;
+-----+-----------+
| gid | garagenum |
+-----+-----------+
| 1 | room1 |
+-----+-----------+

mysql> select * from auto;
+--------+---------+----------+----------+
| autoId | autonum | autotype | garageid |
+--------+---------+----------+----------+
| 1 | bj0000 | car | 1 |
| 2 | bj1231 | bus | 1 |
+--------+---------+----------+----------+
-----------------------------------------------------------------------

(三)设置cascade={CascadeType.PERSIST} 当把 @OneToMany(mappedBy=”garage”) public Set getAutos() { return autos; } 改为: @OneToMany(cascade={CascadeType.PERSIST} ,mappedBy=”garage”) public Set getAutos() { return autos; } 即多添加了一行cascade={CascadeType.PERSIST} 申明级联级联保存 删除前面生成的数据库表garage 和 auto 再次运行save()方法 这是我们看到数据库中都有对应的记录 +—–+———–+ | gid | garagenum | +—–+———–+ | 1 | room1 | +—–+———–+

+——–+———+———-+———-+ | autoId | autonum | autotype | garageid | +——–+———+———-+———-+ | 1 | bj0000 | car | 1 | | 2 | bj1231 | bus | 1 | +——–+———+———-+———-+ 观察发出的sql语句: Hibernate: insert into Garage (garagenum) values (?) Hibernate: insert into Auto (autonum, autotype, garageid) values (?, ?, ?) Hibernate: insert into Auto (autonum, autotype, garageid) values (?, ?, ?)

经验分享 程序员 微信小程序 职场和发展