Hibernate 学习心得之一 多对多关系中,中间表无法插入数据。

最近学习 spring4+hibernate4,学习中遇到了很多坑。
在这里我来说说我遇到的坑,这里就不介绍如何spring如何集成hibernate。
目前学习过程中,我遇到的两个问题
1.为何在hibernate多对多关系中,无法插入中间表的数据
2.为何配置了spring事务注解。可是在使用@transactional Hibernate保存数据还是没能正常执行事务。
先贴出两个类,Person 和 Song,人物类和歌曲类。get,set方法等略掉
@Entity
@Table(name = "Person")
public class Person {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private int id;@Column(name = "name")private String name;//身高 单位cm@Column(name = "height")private float height;//体重 单位kg@Column(name = "weight")private float weight;//性别@Column(name = "gender")private boolean gender;//年龄@Column(name = "age")private int age;@ManyToMany()@Cascade(value = {CascadeType.SAVE_UPDATE})@JoinTable(name = "Song_Person",joinColumns = {@JoinColumn(name = "personId", referencedColumnName="id")},inverseJoinColumns = {@JoinColumn(name = "songId", referencedColumnName="id")})private Set<Song> songs = new HashSet<Song>();
}@Entity
@Table(name = "Song")
public class Song {@Id@GeneratedValueprivate int id;@Column(name = "songName")private String songName;//演唱者@ManyToMany()@Cascade(value = {CascadeType.SAVE_UPDATE})@JoinTable(name = "Song_Person",//本表与中间表的外键对应关系joinColumns = {@JoinColumn(name = "songId", referencedColumnName="id")},//另一张表与中间表的外键的对应关系inverseJoinColumns = {@JoinColumn (name = "personId", referencedColumnName="id")})private Set<Person> singers = new HashSet<Person>();
}
Person 和 Song 存在多对多的关系
1.第一个问题,为何在hibernate多对多关系中,无法插入中间表的数据
一开始使用这种方法保存数据。
public Integer savePerson(String songName){
Song song = new Song();
song.setSongName(songName);
Person person = new Person("张国荣", 180.0F, 56.8F, true, 40);
person.getSongs().add(song);
personDao.save(person);
}
public Integer save(Person entity) {int id = (Integer) sessionFactory.openSession().save(entity);return id;
}
save() 方法 使用 sessionFactory.openSession() 保存数据,结果死活中间表保存不了数据。也没有报错,一开始的解决方法是看注解有没有用错。后来查资料发现并没有用错。经过各种测试后发现 需要调用事务开启和提交。
改成:
public Integer save(Person entity) {//开启一次事物Session session = sessionFactory.openSession();Transaction tran = session .beginTransaction();int id = (Integer) session .save(entity);tran.commit();return id;}
2.第二个问题,配置了spring事务注解,可是在使用@transactional Hibernate保存数据还是没能正常执行事务
首先添加Spring配置
<!-- 事物管理器配置  -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory" />
</bean><!-- 注解实现事务 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
然后我就开始使用@Transactional注解
@Transactional
public Integer save(Person entity) {Session session = sessionFactory.openSession();int id = (Integer) session .save(entity);return id;}
可是结果发现,使用了这个注解,之后,反而又再一次不能插入中间表数据了。
最后解决办法是使用
sessionFactory.getCurrentSession(),而不是使用sessionFactory.openSession(),
具体原理,请大家谷歌查。这里就不介绍了。
@Transactional
public Integer save(Person entity) {Session session = sessionFactory.getCurrentSession();int id = (Integer) session .save(entity);return id;
}
改成这样就可以顺利地执行事务,中间表数据也就自然有了。

Hibernate 学习心得1: 多对多关系中,中间表无法插入数据。相关推荐

  1. flask_sqlalchemy 多对多 关系 对中间表的操作

    文章目录 注意 多对多关系表 创建(同时添加中间表page_tag) 不可以只查询一张表来删除(这种做法只能删除一部分.) 应该查询2张表后删除(只删除 中间表page_tag 中的数据) 添加(只添 ...

  2. 获取mysql可行方法_Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法...

    <Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法>要点: 本文介绍了Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法,希望对您有用.如果有 ...

  3. mysql获取一个表的数据作为值插入_请问如何在mysql中得到一个即将插入数据表中的那条数据的id值(id自增长)?...

    我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数, 一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的. 但在多线程情况下,就不行了. 下面 ...

  4. form表单、控制器中接收表单提交数据的4种方式

    Form表单 这篇文章主要讲的是form表单的提交 之前我们接触过的form表单元素是在Bootstrap框架里面,这次也将用到Bootstrap框架去布局(见图表1)通过Bootstrap框架布局呈 ...

  5. hibernate的多对多关系中对inverse属性的设置

    现有user,role和user-role表,user-role为两表中间的关系表,两表为[多对多关系] 现给role(被动)设置inverse="true"(放弃对关系的维护,即 ...

  6. Hibernate从零开始_07_多对多关系(中间表)

    1.Hibernate多对多(中间表含多个字段)的把多对多拆分为两个一对多.实现如下: 学生类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

  7. mysql 多对多建表_mysql – 为什么在多对多关系中创建一个新表?

    我正在创建一个数据库来存储有关乐器的信息.我在MySQL工作台中使用EER图来可视化每个表之间的关系. 当我创建多对多(n:m)关系时,会创建一个新表,其中包含新关系中涉及的表的主键.其他关系,如一对 ...

  8. 关系型数据库中多对多关系的中间表的命名规则

    在关系型数据库中,除了有一对一,一对多外,还有多对多的关系.前两种关系只需要表本身就能表达清楚,然而多对多需要第三张中间表才能表达清楚多对多的关系. 中间表在一般情况下是由三个字段组成: 1.中间表本 ...

  9. 多对多关系的多表关联查询

    1.什么是多对多关系 多对多关系(百度):多对多关系是关系数据库中两个表之间的一种关系, 该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关.第二个表中的一个行也可以与第一个表中的一个或多个 ...

最新文章

  1. php合并数组中相同的元素
  2. c语言中循环结构的作用,C语言循环结构知识点
  3. python有证书考吗-学python需要考证吗?
  4. PowerDesigner 16安装注意事项
  5. linux top 命令可视化_Linux 使用 top 命令查看系统的运行情况
  6. arp协议属于哪一层_TCP/IP协议栈-之-ARP协议分析
  7. python3 beautifulsoup_Python3中BeautifulSoup的使用方法
  8. php swoole能干,PHP swoole怎么用
  9. Unity基础——碰撞体
  10. 计算机专业要考哪些证书?这5种证书含金量最高,拿到就是高薪
  11. 漫画 | 揭密微信诞生记之民间传说
  12. Mary_Morton [XCTF-PWN][高手进阶区]CTF writeup攻防世界题解系列17
  13. Excel插入图表失真(数据格式原因)修复笔记
  14. 神奇宝贝五分类:网络自定义
  15. Win10快捷键,管多
  16. 文心一言 vs GPT4
  17. .net 服务器推送信息,.net websocket服务端开发,实现消息推送功能
  18. post攻击 xxs_如何正确防御xss攻击
  19. ERR! code 1; ERR! path \node_modules\node-sass;
  20. 细细品味Flex——BlazeDS开发指南

热门文章

  1. 北邮人导航html代码,北邮人导航 · BYR-Navi 的安装与配置
  2. 详解双频光栅图案的轮廓法(PMP和FTP)
  3. SAR图像的干涉相位 matlab_聊聊三维重建-条纹法之相位法-1
  4. 除甲醛空气净化器哪个牌子最好
  5. 嵌入式常用两类电源研究(DC-DC和LDO)
  6. 一个萝卜一个坑:短网址开发运维经验总结分享
  7. 不错的培训机构和课程
  8. Python 一文学会字典数据类型【简单易懂,代码可以直接运行,强烈推荐】
  9. 微信小程序开发工具安装流程
  10. Salesforce从业者最重要的6个基础认证!