java.lang.StackOverflowError异常解决

在hibernate一对多映射中,两个实体都重写了toString()方法,,应用程序递归太深了,所以发生了堆栈溢出。解决方法就是将多的一方对象里面重写的toString方法去掉,或者两个对象里面重写的toString方法都去掉
另一个问题是将一方的inserse设置为true,只有一方维护关系,否则会造成重复更新。

一、Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录。

Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库。按照原来的映射文 件,people.getAddresses().add(address),即主控方对象的状态发生了改变,因此数据库会跟着对象状态的变化来同步更新 数据库;而address.setPeople(people),即被控方对象的状态发生了改变,它是不能触发对象和数据库的同步更新的。



实例1:

举个最简单的一对多父子关系。那么代码就写成:

父亲中的关系映射

{set name="children" lazy="true" inverse="true"}
      {key column="parent_id"/}
      {one-to-many class="test.Child"/}
{/set}

儿子中关系映射

{many-to-one name="parent" column="parent_id" not-null="true"/}
Parent p = new Parent();
Child c = new Child();
c.setParent(p);  //维护父子之间关系
p.getChildren().add(c);

session.save(p);
session.flush();

注意:{many-to-one}总是设成“inverse=false”的,而且这个属性在Mapping中是不存在的!

这样运行的下来的结果就是:

Hibernate: insert into parent (id) values (?)
Hibernate: insert into child (parent_id, id) values (?, ?)

那么假如c.setParent(p)注释掉,结果就是:

Hibernate: insert into parent (id) values (?)



实例2:

一个Person可以参加多个Event,一个Event有多个Person参加。
映射文件如下:

<!-- Person.hbm.xml -->
<hibernate-mapping package="events">
  <class name="Person" table="person">
      <id name="id" column="person_id">
          <generator class="native"/>
      </id>
      <property name="age" length="0"/>
      <property name="firstname"/>
      <property name="lastname"/>
      <set name="events" table="person_event">
          <key column="person_id"/>
          <many-to-many column="event_id" class="events.Event"/>
      </set>
  </class>
</hibernate-mapping>

<!-- Event.hbm.xml -->
<hibernate-mapping>
  <class name="events.Event" table="events">
      <id name="id" column="event_id">
            <generator class="native"/>
      </id>
      <property name="date" column="events_date" type="timestamp"/>
      <property name="title" column="events_title"/>
      <set name="participants" table="person_event" inverse="true">
          <key column="event_id"/>
          <many-to-many column="person_id" class="events.Person"/>
      </set>
  </class>
</hibernate-mapping>

inverse=true的含义: 由双向关联另一方维护该关联,己方不维护该关联(只能进行查询操作)。在上述代码中,由Person方维护该关系,示例代码如下(以向Person参与的Event中加入新的Event为例):

 Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Person p = (Person) session.load(Person.class, personId);
        Event e = (Event) session.load(Event.class, eventId);
    p.getEvents().add(e);//执行该代码时,hibernate会向中间表 person_event中插入person_id和event_id记录,如果换成e.getParticipants().add(p)的话,该代码将不会被执行,即hibernate不会向表person_event中插入记录。
    session.getTransaction().commit();

要注意的一点:在双向关联的关系中,映射的column(和table)的值要一致(即要用相同的表名和列名),不然设置为inverse=”true”的这方将失去这个双向关系,而变成了一个单向关联。

时间: 2024-09-27 16:38:51

java.lang.StackOverflowError异常解决的相关文章

Exception in thread &amp;amp;quot;main&amp;amp;quot; java.lang.StackOverflowError异常问题

问题描述 今天在学习Hibernate一对一关联的时候,跟平常一样,写POJO,然后测试时,报了Exceptioninthread"main"java.lang.StackOverflowError异常,百度得知是程序陷入了无限循环,但就是一个简单的JavaBean,也没有哪段程序会导致错误,然后经过测试,给Person和IdCard加入了无参构造,程序就能正常运行了,但不知道原理是什么,求大神解答packagecom.wss.dao;publicclassPerson{private

线程-新人求助关于java.lang.StackOverflowError的异常问题

问题描述 新人求助关于java.lang.StackOverflowError的异常问题 public class ProcessRow { Properties source= new Properties(); { try { FileInputStream fis = new FileInputStream(new File( inputPropertieName())); InputStreamReader isr = new InputStreamReader(fis, "UTF-8&

测试第三方提供的接口,运行报错java.lang.AbstractMethodError如何解决

问题描述 测试第三方提供的接口,运行报错java.lang.AbstractMethodError如何解决 2016-05-24 09:08:12.918::WARN: Nested in org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.AbstractMethodError: javax.ws.rs.core.UriBuil

HashMap中java.lang.NullPointerException异常问题

问题描述 //添加根结点Iterator<String>Iter=resultMap.keySet().iterator();inti=0;while(Iter.hasNext()){i++;System.out.println(i);StringscCode=Iter.next();if(resultMap.get(Iter.next())!=null){StringscParent=resultMap.get(Iter.next()).toString();System.out.print

找不到方法-structs2 java.lang.NoSuchMethodException怎么解决?

问题描述 structs2 java.lang.NoSuchMethodException怎么解决? 理论上userPre和evaluation1Pre应该除了具体实现没有其他差别,但是在实际运行过程中,evaluation1Pre可以正常运行,而userPre就会报java.lang.NoSuchMethodException: form.userPreAction.execute()的错误,实在是找不到为什么,跪求各路大神帮解决.(真的没有C币了,见谅...) 解决方案 java.lang.

java.lang.StackOverflowError的问题

问题描述 java.lang.StackOverflowError的问题 很简单的一段代码,也知道是哪里错误,就是不明白为什么,希望大侠们指教指教 当调用main.drop(6000) 就报错了, drop(int times)方法里调用了自身的方法,这样为什么会导致报错呢 ```public class Main { private double TotalHeight = 100; private double CurHeight = 50; public void drop(int tim

java.lang.IllegalArgumentException 异常,求大牛说下解决方案

问题描述 java.lang.IllegalArgumentException 异常,求大牛说下解决方案 解决方案 java.lang.IllegalArgumentException的解决方案java.lang.IllegalArgumentException:(读取配置文件异常) 解决方案二: 这是用了spring框架吧,报是非法的参数错误,你看一下配置文件中是否有不存在的类,或者其它地方有不存在的一些类或者其它的内容.还有同样问题的参考:http://bbs.csdn.net/topics

ehcache-EHCache报出java.lang.IllegalMonitorStateException异常

问题描述 EHCache报出java.lang.IllegalMonitorStateException异常 我写的代码如下所示,其中EHCacheService.putIn是封装了EHCache的put函数,key=1,一直key++. import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import j

javaweb-求大神~ java.lang.IllegalStateException异常代码如下

问题描述 求大神~ java.lang.IllegalStateException异常代码如下 java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435) at cn.cms.filter.LoginFilter.doFilter(LoginFilter.java:55) at org.apache.catalina.co