首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

Hibernate中一对一实体关系的主键关联有关问题,

2011-11-27 
Hibernate中一对一实体关系的主键关联问题,急小弟在利用Hibernate进行一对一关系操作时,利用的主键关联.遇

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>

就可以了
其他简单的你就会自己修改了

热点排行