hibernate编程中的一个错误及成因

众所周知,ssh三大框架中的hibernate是一个ormapping的框架,也就是用来建立从对象到数据库表的关系。它的强大之处在于可以根据配置文件,将一个持久化类(可以理解为一个javabean)映射成为数据库中的一个表。而在数据库的设计当中一个非常重要的方面是多表设计,包括一对多和多对多。而今天我在进行一个一对多的操作过程中遇到了一个错误,感觉这个问题一旦疏忽就很容易发生,因此拿出来和大家分享分享。


错误描述:在进行一对多的持久化类级联存储的过程中系统报错。
错误截图:hibernate一对多级联错误截图
造成错误的代码如下:

``` 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>

“`
好啦,大功告成,错误解决!所以我们发现,在平常的编程中应该细心再细心,这样才能避免一些错误,节省时间和精力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值