可能java设计缺陷、希望高手指正错误

创建表语句
create table t_user(
u_id varchar(255),
u_name varchar(255),
u_age Integer,
u_price double(5,2),
uc_id varchar(255),
primary key(u_id)
);

create table t_user_class(
uc_id varchar(255),
uc_classNo Integer,
uc_funds double(5,2),
uc_back varchar(255),
primary key(uc_id)
);
java类:
1、UserT.java
package com.wolf.pojo.oneToone;

import java.io.Serializable;

public class UserT  implements Serializable{

private String id;
public String name;
private Integer age;
private double price;
private UserClass userclass;

public UserT(){}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

public UserClass getUserclass() {
return userclass;
}

public void setUserclass(UserClass userclass) {
this.userclass = userclass;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
long temp;
temp = Double.doubleToLongBits(price);
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result
+ ((userclass == null) ? 0 : userclass.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserT other = (UserT) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (Double.doubleToLongBits(price) != Double
.doubleToLongBits(other.price))
return false;
if (userclass == null) {
if (other.userclass != null)
return false;
} else if (!userclass.equals(other.userclass))
return false;
return true;
}

@Override
public String toString() {
return "UserT [age=" + age + ", id=" + id + ", name=" + name
+ ", price=" + price + ", userclass=" + userclass + "]";
}

public UserT(String id, String name, Integer age, double price,
UserClass userclass) {
super();
this.id = id;
this.name = name;
this.age = age;
this.price = price;
this.userclass = userclass;
}

}
2、UserClass.java
package com.wolf.pojo.oneToone;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class UserClass   implements Serializable{

private  String id;
private Integer classNo;
private double funds;
private String back;
private Set<UserT> users=new HashSet<UserT>();

public UserClass(){}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public Integer getClassNo() {
return classNo;
}

public void setClassNo(Integer classNo) {
this.classNo = classNo;
}

public double getFunds() {
return funds;
}

public void setFunds(double funds) {
this.funds = funds;
}

public String getBack() {
return back;
}

public void setBack(String back) {
this.back = back;
}

public Set<UserT> getUsers() {
return users;
}

public void setUsers(Set<UserT> users) {
this.users = users;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((back == null) ? 0 : back.hashCode());
result = prime * result + ((classNo == null) ? 0 : classNo.hashCode());
long temp;
temp = Double.doubleToLongBits(funds);
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((users == null) ? 0 : users.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserClass other = (UserClass) obj;
if (back == null) {
if (other.back != null)
return false;
} else if (!back.equals(other.back))
return false;
if (classNo == null) {
if (other.classNo != null)
return false;
} else if (!classNo.equals(other.classNo))
return false;
if (Double.doubleToLongBits(funds) != Double
.doubleToLongBits(other.funds))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (users == null) {
if (other.users != null)
return false;
} else if (!users.equals(other.users))
return false;
return true;
}

@Override
public String toString() {
return "UserClass [back=" + back + ", classNo=" + classNo + ", funds="
+ funds + ", id=" + id + ", users=" + users + "]";
}

public UserClass(String id, Integer classNo, double funds, String back,
Set<UserT> users) {
super();
this.id = id;
this.classNo = classNo;
this.funds = funds;
this.back = back;
this.users = users;
}
}
映射文件:
UserT.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.wolf.pojo.oneToone" auto-import="false">
    <class name="UserT" table="t_user">
    <!-- 多对一:只有单项    -->
        <id name="id" column="u_id">
        </id>
        <property name="name" column="u_name"/>
        <property name="age" column="u_age"/>
        <property name="price" column="u_price"/>
        <many-to-one name="userclass" 
        class="com.wolf.pojo.oneToone.UserClass" 
        column="uc_id" 
        ></many-to-one>
    </class>
</hibernate-mapping>

UserClass.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.wolf.pojo.oneToone">
    <class name="UserClass" table="t_user_class">
        <id name="id" column="uc_id"/>
        <property name="classNo" column="uc_classNo"/>
        <property name="funds" column="uc_funds"/>
        <property name="back" column="uc_back"/>
        <!-- inverse="true":关系维护由UserClass负责维护 -->
        <set name="users" lazy="false" cascade="all" inverse="true">
         <key column="uc_id"></key>
         <one-to-many class="com.wolf.pojo.oneToone.UserT"/>
        </set>
    </class>
</hibernate-mapping>

测试类:
package com.wolf.main;

import java.util.UUID;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.wolf.pojo.oneToone.UserClass;
import com.wolf.pojo.oneToone.UserT;

public class UtilMain {
 public static void main(String[] args) {
 
Session session= HibernateSessionFactory.getSession();
Transaction tr=session.beginTransaction();

UserClass usercls=new UserClass();
usercls.setId(UUID.randomUUID().toString());

UserT user=new UserT();
user.setId(UUID.randomUUID().toString());
user.setName("user0");

UserT user1=new UserT();
user1.setId(UUID.randomUUID().toString());
user1.setName("user1");

usercls.getUsers().add(user1);
usercls.getUsers().add(user);

user.setUserclass(usercls);
user1.setUserclass(usercls);

System.out.println(usercls.getUsers());

session.save(usercls);
tr.commit();
}
}
出现错误是:
Exception in thread "main" java.lang.StackOverflowError
at java.util.HashMap$KeyIterator.<init>(HashMap.java:826)
at java.util.HashMap.newKeyIterator(HashMap.java:840)
at java.util.HashMap$KeySet.iterator(HashMap.java:874)
at java.util.HashSet.iterator(HashSet.java:153)
at java.util.AbstractCollection.toString(AbstractCollection.java:414)
at java.lang.String.valueOf(String.java:2826)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at com.wolf.pojo.oneToone.UserClass.toString(UserClass.java:109)
at java.lang.String.valueOf(String.java:2826)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at com.wolf.pojo.oneToone.UserT.toString(UserT.java:108)
at java.lang.String.valueOf(String.java:2826)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at java.util.AbstractCollection.toString(AbstractCollection.java:422)
at java.lang.String.valueOf(String.java:2826)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at com.wolf.pojo.oneToone.UserClass.toString(UserClass.java:109)

 

最后解决方案是:java-hashCode内部实现直接循环自己的hashCode方法,测试进入死循环,一直出现错误

解决方案:

1、删除hashCode的方法

2、在使用的bean类中set不要实例化,在使用的时候临时创建set集合,然后再存放到pojo对象所以引用的集合中

3、这是javaAPI中说的异常结论:

public class StackOverflowError

extends VirtualMachineError


Thrown when a stack overflow occurs because an application recurses too deeply. (堆栈溢出发生时抛出一个应用程序是递归因为太深。)

 

下面是其他朋友的测试地址:

http://bantouyan.iteye.com/blog/963759

http://www.myexception.cn/ruby-rails/1050378.html

 

 

如果有哪位高手知道这个错误的解决方案,还请多多指教

 

时间: 2024-09-18 02:57:29

可能java设计缺陷、希望高手指正错误的相关文章

java-我是初学者,不知道怎么运行这些程序,希望高手指导一下

问题描述 我是初学者,不知道怎么运行这些程序,希望高手指导一下 我下载了一个图书管理系统,里面有个scr文件和一个txt的数据库设计脚本,scr里面有11个java文件但是都没有main语言,我想请问这个管理系统该怎么运行,希望给出详细步骤,敬请高手解答 解决方案 别人是web工程,你可以搞个Tomcat服务器将工程部署上去.这么坑爹的问题还是去网上搜一下吧,或者...找个老师教一下吧 解决方案二: main方法是运行Java Application小程序的入口,你说的这是个Java Web项目

网页设计易用性:43条网站设计中常犯的错误

这是一篇关于网站易用性的文章,作者以亲身体会讲述了43条网站设计中常犯的错误,而无疑这些错误会大大影响网站的可用性.如今网站易用性已成为一种趋势,但纵观国内的各大网站,似乎易用性并未成为设计者们广泛理解的概念,因此希望这篇文章对大家能有作用. 1. 用户必须在几秒钟知道网站是做什么的. 注意力是因特网上最有价值的货币.如果访问者无法在几秒钟之内得知你的网站的方向,他很有可能转而访问其他网站.你必须迅速地告诉访问者为什么要在你的网站上花费时间. 2. 让网站易于速读. 因特网不是书,因此没必要使用

Java的违例控制:解决错误

从最古老的程序设计语言开始,错误控制一直都是设计者们需要解决的一个大问题.由于很难设计出一套完美的错误控制方案,许多语言干脆将问题简单地忽略掉,将其转嫁给库设计人员.对大多数错误控制方案来说,最主要的一个问题是它们严重依赖程序员的警觉性,而不是依赖语言本身的强制标准.如果程序员不够警惕--若比较匆忙,这几乎是肯定会发生的--程序所依赖的错误控制方案便会失效. "违例控制"将错误控制方案内置到程序设计语言中,有时甚至内建到操作系统内.这里的"违例"(Exception

arcgis java开发问题 求高手帮帮

问题描述 arcgis java开发问题 求高手帮帮 SeLayer insertLayer=null; SeConnection conn=null; try { conn = new SeConnection(server,81, database, user, password); Vector layerList = conn.getLayers(); for (int index = 0; index < layerList.size(); index++) { SeLayer lay

Javascript的10个设计缺陷

前几篇文章,我经常说Javascript的设计不够严谨,有很多失误. 今天的这一篇,前半部分就谈为什么会这样,后半部分将列举Javascript的10个设计缺陷. 我参考的文献主要是Douglas Crockford的专著<Javascript语言精粹>(JavaScript: The Good Parts)和Fredrik Holmström的文章<我对Javascript的抱怨>(My gripes with Javascript). 一.为什么Javascript有设计缺陷?

央视曝三星手机存设计缺陷 维修漫天要价

[三星Note.S系列存重大设计缺陷:一天死机三十次]从"突然死机"到"无法开机"再到高价维修,已经成为众多三星手机NOTE系列及S系列机主的共同烦恼.<经济半小时>记者采访专家指出:这是因为,三星产品设计本身存在缺陷,很可能是存储芯片的擦除指令存在着问题,这个存储芯片相当于电脑硬盘.而就是这样的硬件设计问题,却让消费者买单,一次维修少则800块,多则2000块-- 智能机频频变"砖头"原因成谜,维修漫天要价消费者叫苦不迭 2012年

java设计优化之代理模式_java

代理模式使用代理对象完成用户的请求,屏蔽用户对真实对象的访问. 代理模式的用途很多,比如因为安全原因,需要屏蔽客户端直接访问真实对象:或者在远程调用中,需要使用代理对象处理远程方法中的技术细节:或者为了提升系统,对真是对象进行封装,从而达到延迟加载的目的. 在系统启动时,将消耗资源最多的方法使用代理模式分离,就可以加快系统的启动速度,减少用户的等待时间.在用户真正在做查询是,再由代理类加载真实的类,完成用户请求.这就是使用代理模式达到延迟加载的目的. 1.静态代理实现: 主题接口: public

java设计优化之单例模式_java

单例模式是一种对象创建模式,确保系统中一个类只有一个实例. 在java语言中,这样做有两大好处: 1.对于频繁使用的对象,可以省略创建对象所话费的时间: 2.由于new操作的次数减少,对于系统内存的使用频率降低,这样减少GC的压力,缩短GC停顿的时间. 单例模式细分: 1. public class Singleton{ private Singleton(){ System.out.println("Singleton.Singleton()"); } private static

文件操作-Java写文件乱码,这个错误我找了好半天,还是没有找出来。大家帮帮我可好?

问题描述 Java写文件乱码,这个错误我找了好半天,还是没有找出来.大家帮帮我可好? public void Save() { DataOutputStream out = null; try { out = new DataOutputStream(new FileOutputStream("D:pcb-input.txt")); } catch (FileNotFoundException e1) {} int i; for(i=0;i<sum;i++) { //输出PCB信