您的位置:首页 > 编程语言

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>


“`

好啦,大功告成,错误解决!所以我们发现,在平常的编程中应该细心再细心,这样才能避免一些错误,节省时间和精力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: