我做的一个Hibernate 一对多 多对一的 保存和读取操作 保存 没问题 但是 读取那老是提示 内存溢出
下面是 实体类
Department 类 有setter 和getter 方法
private Integer id;
private String name;
private Set employees=new HashSet();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
Emloyee 类 有setter 和getter 方法
private Integer id;
private String name;
private Department department;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
下面是映射类
Department.hbm.xml
<class name="Department" table="department">
<id name="id">
<generator class="native"/>
</id>
<property name="name" type="string" column="name" />
<set name="employees">
<key column="departmentId"></key>
<one-to-many class="Employee"/>
</set>
</class>
Employee.hbm.xml
<class name="Employee" table="employee">
<id name="id">
<generator class="native" />
</id>
<property name="name" type="string" column="name" />
<many-to-one name="department" class="Department" column="departmentId"></many-to-one>
</class>
下面是测试类
private static SessionFactory sessionFactory;
static{
sessionFactory=new Configuration()//
.configure()//
.buildSessionFactory();
}
@Test
public void testget() throws Exception{
Session session=sessionFactory.openSession();
session.beginTransaction();
Department department=(Department) session.get(Department.class, 1);
System.out.println(department);
System.out.println(department.getEmployees());
session.getTransaction().commit();
session.close();
}
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!-- 数据库基本配置信息 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///htest</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 数据库其他相关配置 -->
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping resource="org/xxf/OneToManyA/Department.hbm.xml"/>
<mapping resource="org/xxf/OneToManyA/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
测试后 它就老提示 我内存溢出
java.lang.StackOverflowError
at java.lang.Integer.toString(Integer.java:305)
at java.lang.Integer.toString(Integer.java:116)
at java.lang.String.valueOf(String.java:2932)
at java.lang.Integer.toString(Integer.java:682)
at java.lang.String.valueOf(String.java:2827)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at org.xxf.OneToManyA.Employee.toString(Employee.java:13)
at java.lang.String.valueOf(String.java:2827)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at java.util.AbstractCollection.toString(AbstractCollection.java:422)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:327)
往下 就一直重复出现错误
别人用一样的代码 测试就没问题 我就老报错 求各位大神帮指导一下
你不是内存溢出,是栈溢出,因为你的里面有循环调用,我看了一下
org.xxf.OneToManyA.Employee.toString(Employee.java:13)
你是不是重载了toString方法,因为你没有贴出全部代码,
你的toString方法中存在循环调用,这个是你遇到stackoverflow的原因!!!
堆栈溢出了,肯定关联关系配置不当导致递归。检查下你的这两个类有没有重写toString方法呢。
可能是你的关联配置不当导致的,可以修改下你的配置,添加一些级联相关的属性。具体参考:http://www.jb51.net/article/44749.htm
这个跟你的例子一样的,只是实体名称不一样,你可以试试。