Hibernate中一对一实体关系的主键关联问题,急
小弟在利用Hibernate进行一对一关系操作时,利用的主键关联.遇到了下面的问题,现将问题描述如下:
在MySQL的quickstart数据库中有两个表,t_student和t_card。
t_student的构建语句如下:
create table t_student(id int primary key,name varchar(20),card_id varchar(20),sex varchar(20),
age int));
t_card的结构如下:
create table t_card(id int primary key,name varchar(20));
通过Hibernate的一对一实体关系的主键关联来操作实体Student和Card
Student.java的代码如下:
package register;
import register.Card;
public class Student{
private int id;
private String name;
private String card_id;
private String sex;
private int age;
private Card card;
public Student(){
}
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getCard_id(){
return card_id;
}
public void setCard_id(String card_id){
this.card_id=card_id;
}
public String getSex(){
return sex;
}
public void setSex(String sex){
this.sex=sex;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
public Card getCard(){
return card;
}
public void setCard(Card card){
this.card=card;
}
}
Card.java的代码如下:
package register;
import register.Student;
public class Card{
private int id;
private String name;
private Student stu;
public Card(){
}
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public Student getStudent(){
return stu;
}
public void setStudent(Student stu){
this.stu=stu;
}
}
Hibernate的配置文件如下:
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN "
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd ">
<hibernate-configuration>
<session-factory>
<property name= "connection.datasource "> java:comp/env/jdbc/quickstart </property>
<property name= "dialect "> org.hibernate.dialect.MySQLDialect </property>
<property name= "show_sql "> false </property>
<!-- Mapping files -->
<mapping resource= "register.hbm.xml "/>
<mapping resource= "Student.hbm.xml "/>
<mapping resource= "Card.hbm.xml "/>
</session-factory>
</hibernate-configuration>
Student.hbm.xml如下:
<?xml version= "1.0 "?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN "
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd ">
<hibernate-mapping>
<class name= "register.Student " table= "t_student ">
<id name= "id " column= "id " type= "int ">
<generator class= "increment "/>
</id>
<property name= "name " column= "name " type= "string "/>
<property name= "card_id " column= "card_id " type= "string "/>
<property name= "sex " column= "sex " type= "string "/>
<property name= "age " column= "age " type= "int "/>
<one-to-one name= "card " class= "register.Card " cascade= "all "/>
</class>
</hibernate-mapping>
Card.hbm.xml如下:
<?xml version= "1.0 "?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN "
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd ">
<hibernate-mapping>
<class name= "register.Card " table= "t_card ">
<id name= "id " column= "id " type= "int ">
<generator class= "foreign ">
<param name= "property "> stu </param>
</generator>
</id>
<property name= "name " column= "name " type= "string "/>
<one-to-one name= "stu " class= "register.Student " constrained= "true "/>
</class>
</hibernate-mapping>
测试的JSP页面如下:
OneToOneRelation.jsp
<%@ page language= "java " pageEncoding= "GB2312 " %>
<%@ page import= "org.hibernate.Transaction "%>
<%@ page import= "org.hibernate.Session "%>
<%@ page import= "org.hibernate.cfg.* "%>
<%@ page import= "org.hibernate.Query "%>
<%@ page import= "org.hibernate.HibernateException "%>
<%@ page import= "register.* "%>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en ">
<html>
<head> <title> </title> </head>
<body bgcolor= "#FFFFFF ">
<%
Student stu=new Student();
stu.setName( "Bill ");
stu.setCard_id( "2004001 ");
stu.setSex( "male ");
stu.setAge(22);
Card card=new Card();
card.setName( "Bill ");
stu.setCard(card);
card.setStudent(stu);
try{
Session ses=HibernateUtil.currentSession();
Transaction ts=ses.beginTransaction();
ses.save(stu);
ts.commit();
HibernateUtil.closeSession();
}
catch(Exception excep){
excep.printStackTrace();
out.println( "wrong ");
//throw excep;
}
%>
</body>
</html>
Tomcat的报错是:
Java.lang.NoClassDefFoundError
我的Tomcat,MySQL和Hibernate的配置都没问题,能正常运行。
出现此问题,小弟自己猜测是否是Student.hbm.xml和Card.hbm.xml的问题,或者是Student.java和Card.java问题。我的Hibernate版本是3.1。
请高手仔细看看小弟上面的代码,多谢了。按时结贴。
[解决办法]
把所有的错误信息全部贴出来
[解决办法]
哪个class找不到,你没有贴出来,去看看tomcat手册,关于classpath的一段。
忍不住要问一下,card_id 为什么要用varchar.
hibernate mapping文件写的确实很乱。
两个表的id是一致的?程序指定的?
[解决办法]
你把t_student和t_card对应的bean文件用工具自动生成啊.这样就不会出错了.
[解决办法]
hibernate 是一个笨重的框架.
[解决办法]
你用的是Hibernate进行一对一关系操作时,利用的主键关联不用你那么麻烦呀?
t_student的构建语句如下:
create table t_student
(id int primary key,
name varchar(20),
sex varchar(20),
age int));
t_card的结构如下:
create table t_card
(id int primary key,
name varchar(20),
stu_id int );
这样也能表示出1:1的关联呀!~!
Student.hbm.xml如下:
<?xml version= "1.0 "?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN "
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd ">
<hibernate-mapping>
<class name= "register.Student " table= "t_student ">
<id name= "id " column= "id " type= "int ">
<generator class= "increment "/>
</id>
<property name= "name " column= "name " type= "string "/>
<property name= "sex " column= "sex " type= "string "/>
<property name= "age " column= "age " type= "int "/>
<one-to-one name= "card " class= "register.Card " cascade= "all "/>
</class>
</hibernate-mapping>
Card.hbm.xml如下:
<?xml version= "1.0 "?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN "
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd ">
<hibernate-mapping>
<class name= "register.Card " table= "t_card ">
<id name= "id " column= "id " type= "int ">
<generator class= "increment "/>
</id>
<property name= "name " column= "name " type= "string "/>
<one-to-one name= "stu " class= "register.Student " column= "stu_id " constrained= "true "/>
</class>
</hibernate-mapping>
就可以了
其他简单的你就会自己修改了