hibernate编程中的一个错误及成因
2015-10-16 21:50
351 查看
众所周知,ssh三大框架中的hibernate是一个ormapping的框架,也就是用来建立从对象到数据库表的关系。它的强大之处在于可以根据配置文件,将一个持久化类(可以理解为一个javabean)映射成为数据库中的一个表。而在数据库的设计当中一个非常重要的方面是多表设计,包括一对多和多对多。而今天我在进行一个一对多的操作过程中遇到了一个错误,感觉这个问题一旦疏忽就很容易发生,因此拿出来和大家分享分享。
错误描述:在进行一对多的持久化类级联存储的过程中系统报错。
错误截图:
造成错误的代码如下:
“`
好啦,大功告成,错误解决!所以我们发现,在平常的编程中应该细心再细心,这样才能避免一些错误,节省时间和精力。
错误描述:在进行一对多的持久化类级联存储的过程中系统报错。
错误截图:
造成错误的代码如下:
``` java public class ClassessTest { @Test public void TestCas(){ Configuration configuration = new Configuration(); configuration.configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Classes classes = (Classes)session.get(Classes.class,1L); //classes.setCname("niuban"); //classes.setDescription("就是牛"); Student student = new Student(); student.setSname("zhanshuai"); student.setDescription("too young too simple"); Set<Student> students = classes.getStudents(); students.add(student); classes.setStudents(students); session.save(classes); transaction.commit(); session.close(); } }``` ``` 首先,Classes和Student这两个类是我自己定义的持久化类,因为一个班中可以有多个学生,所以我们认为班级是一的一方,而学生是多的一方,在Classes中维护一个set,其中存放的是Student类型的对象。 从这段代码中可以发现,我创建了一个Student对象,然后将它放入数据库中保存的第一个班级的Student的set中,然后只保存了Classes对象,若这两个持久化对象是级联的话,hibernate在保存Classes的同时也会将Student保存起来,然而此时服务器报错。于是转而检查配置文件Classes.hbm.xml,内容如下:
<hibernate-mapping> <class name="com.tt.hibernate.domain.Classes"> <id name="cid" type="java.lang.Long" length="20"> <generator class="increment"></generator> </id> <property name="cname" type="java.lang.String" length="200"></property> <property name="description" type="java.lang.String" length="200"></property> <set name="students" > <key> <column name="cid"></column> </key> <one-to-many class="com.tt.hibernate.domain.Student" /> </set> </class> </hibernate-mapping>
这时候我们就发现问题所在了,如果希望Classes和Student两个类是级联的话,那么在这部分的代码的
<set name="students" > <key> <column name="cid"></column> </key> <one-to-many class="com.tt.hibernate.domain.Student" /> </set>
set中应该增加一个属性叫做“cascade”,而明显的,正是由于忘了在set中写这个“cascade”属性,于是无法将两个类级联,造成了这个错误,于是配置文件修改如下:
<set name="students" cascade="save-update"> <key> <column name="cid"></column> </key> <one-to-many class="com.tt.hibernate.domain.Student" /> </set>
“`
好啦,大功告成,错误解决!所以我们发现,在平常的编程中应该细心再细心,这样才能避免一些错误,节省时间和精力。
相关文章推荐
- java演示适配器(adapter)模式
- C语言的运算符的优先级与结合性+ASCII表
- C语言的运算符的优先级与结合性+ASCII表
- java链表
- QT中QMainwindow 类与 QWidget类使用 VS2012 QT5.5
- casperjs中Selectors使用总结
- 【面试题】C语言:实现一个函数,判断一个数是不是素数。
- 编写,编译,运行Java程序过程中的编码解码过程
- yii笔记—数据库1
- C语言中的变量&命名规范
- csrf攻击及其防范介绍
- C语言:实现函数init()初始化数组、 实现empty()清空数组、 实现reverse()函数完成数组元素的逆置
- C语言--求两个数的最大公约数
- C语言中的数据类型&常量
- java中的Lcok为何存在?
- Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚
- C语言:实现一个函数判断year是不是闰年
- 用C语言打印图形&C语言注释符
- Ubuntu 64 下第一个c语言程序
- Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP