<!--跟第一个配置不同的地方没有了 column="USER_ID" 属性-->
<many-to-one
name="user"          
class="relation.one_to_many.TUser"
cascade="all"
outer-join="auto"
not-null="true"
unique="true"/>有错,你少配置了个column,
这个column是标明在数据库中one-many中many相对与one的FK。

解决方案 »

  1.   

    TAddress 是多方 
    TUser是单方 
    并且是双向关联TUser里面可以不配置任何TAddress的表信息,就可以级联保存TAddress 
    对象,因为Taddress表信息在TAddress的映射文件中存在,但是反过来为什么就不能通过?---------------------
    我知道:跟第一个配置不同的地方没有了 column="USER_ID" 属性-->  
    但是在TAddress映射文件里面有这个关系啊,为什么框架找不到呢?
      

  2.   

    我知道错误在:跟第一个配置不同的地方没有了 column="USER_ID" 属性--> 
    但是在TUser.hbm.xml里面有这个关系啊, 
    <key column="USER_ID"/> 
    为什么框架找不到呢?就看第一个例子吧,在
    代码
    <set  
    name="addresses"  
    lazy="false"  
    inverse="true"  
    cascade="all"  
    sort="unsorted"  
    order-by="zipcode asc">  
    <key />  
    <one-to-many class="relation.one_to_many.TAddress"/>  
    </set>  
    里面没有任何类属性addresses的保存信息,但是框架就可以通过另外一个映射文件找到级联保存的表和字段信息,但是第二个例子就不能,为什么?
      

  3.   

    通过试验我已经弄明白了
    代码
      
    <set     
    table="T_Address"        
    name="addresses"     
    lazy="false"     
    inverse="true"     
    cascade="all"     
    sort="unsorted"     
    order-by="zipcode asc">     
    <key column="USER_ID"/>  <!--跟第一个配置不同的地方-->     
    <one-to-many class="relation.one_to_many.TAddress"/>     
    </set>     
    </class>    
      
    里面的column="USER_ID" 和 table="T_Address" 
    是给 inverse="false" 用的 
    如果 inverse="true"的话,那么上面两个属性是可以仍掉的
      

  4.   

    试验过程如下 : 
    代码
    CREATE TABLE T_User(      
    id bigint primary key ,      
    name varchar(50),      
    age int      
    );      
         
    CREATE TABLE T_Address(      
    id bigint primary key ,      
    zipcode varchar(50),      
    tel varchar(50),      
    type varchar(50),      
    address_name varchar(50),      
    user_id bigint,      
    idx int      
    );      
    alter table T_Address      
    add constraint t_address_cons foreign key (User_ID) references T_User(ID);    
      代码
    <hibernate-mapping auto-import="false">  
    <class  
    name="relation.one_to_many.TUser"  
    table="T_User"  
    >  
    <id name="id" column="ID" type="long">  
      <generator class="increment"/>  
    </id>  
    <property name="name" type="string" column="name" />  
    <property name="age" type="int" column="age" />  
    <set  
    name="addresses"  
    lazy="false"  
    inverse="false"  
    cascade="all"  
    sort="unsorted"  
    order-by="zipcode asc">  
    <key />  
    <one-to-many class="relation.one_to_many.TAddress"/>  
    </set>  
    </class>  代码
    <hibernate-mapping auto-import="false">  
    <class  
    name="relation.one_to_many.TAddress"  
    table="T_Address"  
    >  
    <id name="id" column="ID" type="long">  
      <generator class="increment"/>  
    </id>  
    <property name="zipcode" type="string" column="zipcode" />  
    <property name="tel" type="string" column="tel" />  
    <property name="addressName" type="string" column="address_name" />  
    <property name="type" type="string" column="type" />  
    <property name="idx" type="int" column="idx" />  
    <many-to-one  
    name="user"  
    class="relation.one_to_many.TUser"  
    column="USER_ID"  
    cascade="all"  
    outer-join="auto"  
    not-null="true"  
    unique="true"/>  
    </class>  
    </hibernate-mapping>  
    Hibernate: select max(ID) from T_Address 
    Hibernate: select max(ID) from T_User 
    Hibernate: insert into T_User (name, age, ID) values (?, ?, ?) 
    Hibernate: insert into T_Address (zipcode, tel, address_name, type, idx, USER_ID, ID) values (?, ?, ?, ?, ?, ?, ?) 
    Hibernate: insert into T_Address (zipcode, tel, address_name, type, idx, USER_ID, ID) values (?, ?, ?, ?, ?, ?, ?) 
    Hibernate: update T_Address set id=? where ID=? 
    Hibernate: update T_Address set id=? where ID=?最下面那个SQL语句就是我得到的结论的依据,因为inverse="false" 而且<key />没有,所以把 
    ID作为默认的外键列进行更新在多对多的试验里面可以发现当inverse="false" 并且没有table属性就会把name的值当表名 
     
     
    返回顶端      最后更新:2006-11-11 15:19      
    我来评分: 不能给自己的帖子评分  
     
     
    ppm10103等级:  文章: 16
    积分: 141 
     
            时间: 1 分钟前    评级:    (0位会员评分)  引用 推荐 收藏 编辑 收入博客       --------------------------------------------------------------------------------
     
    下面是多对多的试验 
    代码
    drop database if exists TEST;   
      create database TEST;   
      use TEST;   
      
      create table T_Group(   
         ID bigint not null,   
         NAME varchar(15),   
         primary key (ID)   
      );   
      
      create table T_Role(   
        ID bigint not null,   
        NAME varchar(15),   
        primary key(ID)   
      );   
      
      create table Group_Role(   
        Group_ID bigint not null,   
        Role_ID bigint not null,   
        primary key(Group_ID,Role_ID)   
      );   
      
      alter table Group_Role   
      add constraint FK_Group foreign key (Group_ID) references T_Group(ID);   
      
      alter table Group_Role   
      add constraint FK_Role foreign key (Role_ID) references T_Role(ID);   
    TGroup.hbm.xml 
    代码
    <?xml version="1.0" encoding="GBK" ?>  
    <!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
    "hibernate-mapping-3.0.dtd">  
      
    <hibernate-mapping auto-import="false">  
    <class  
    name="relation.many_to_many.TGroup"  
    table="T_Group"  
    >  
    <id name="id" column="ID" type="long">  
      <generator class="increment"/>  
    </id>  
    <property name="name" type="string" column="name" />  
      
    <set  
    name="roles"  
    lazy="true"  
    inverse="false"  
    cascade="save-update">  
    <!--   
    因为inverse="true"所以不需要去维护外键关系,所以也不需要相关信息    
    如果为false的话那么就需要table属性和外键名属性   
    -->  
    <key/>  
    <many-to-many class="relation.many_to_many.TRole"/>  
    </set>  
    </class>  
    </hibernate-mapping>  
    TRole.hbm.xml 
    代码
    <hibernate-mapping auto-import="false">  
    <class  
    name="relation.many_to_many.TRole"  
    table="T_Role"  
    >  
    <id name="id" column="ID" type="long">  
      <generator class="increment"/>  
    </id>  
    <property name="name" type="string" column="name" />  
    <set  
    name="groups"  
    table="Group_Role"  
    lazy="false"  
    inverse="true"  
    cascade="save-update">  
    <key column="role_id" />  
    <many-to-many class="relation.many_to_many.TGroup" column="group_id" outer-join="auto"/>  
    </set>  
    </class>  
    </hibernate-mapping>  
    从下面的SQL语句就可以证明我的看法是正确的,连接表hibernate居然认为是roles 
    就是因为TGroup.hbm.xml中inverse="false" 并且没有table信息,hibernate就把属性名当表名处理了 
    虽然在TRole.hbm.xml中有正确的连接表名 
    代码
    Hibernate: select max(ID) from T_Group   
    Hibernate: select max(ID) from T_Role   
    Hibernate: insert into T_Group (name, ID) values (?, ?)   
    Hibernate: insert into T_Role (name, ID) values (?, ?)   
    Hibernate: insert into T_Group (name, ID) values (?, ?)   
    Hibernate: insert into T_Role (name, ID) values (?, ?)   
    Hibernate: insert into roles (id, elt) values (?, ?)   
    Hibernate: insert into roles (id, elt) values (?, ?)   
    所以一对多的那个地方可以省略也是这个原有了