<!--跟第一个配置不同的地方没有了 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。
<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。
解决方案 »
- 新手求解答有关Servlet的问题!
- EJB中用持久化的相关问题
- struts1.2 actionForm如何获得选中radio的值
- 请教正则表达式的写法
- Weblogic启动时的错误----新手,各位大侠请帮忙!
- XML-DOM中如何取得节点的值啊?
- 从。net转到java上容易吗,敬请赐教!
- 请问我用jboss+jbuilder9,一定要用j2ee sdk1.4吗?书上怎么只说用j2sdk呢?如果都要用sdk1.5+j2eesdk1.4可以吗?
- 请问谁有定时任务的源程序(比如每过1秒就打印“hello”),在线等!!!急急!!!
- 如何做,急啊
- Hibernate中如何获取某个字段的全部值
- 请问如何把struts-config.xml里的ACTION配置放在几个不同的文件里?
TUser是单方
并且是双向关联TUser里面可以不配置任何TAddress的表信息,就可以级联保存TAddress
对象,因为Taddress表信息在TAddress的映射文件中存在,但是反过来为什么就不能通过?---------------------
我知道:跟第一个配置不同的地方没有了 column="USER_ID" 属性-->
但是在TAddress映射文件里面有这个关系啊,为什么框架找不到呢?
但是在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的保存信息,但是框架就可以通过另外一个映射文件找到级联保存的表和字段信息,但是第二个例子就不能,为什么?
代码
<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"的话,那么上面两个属性是可以仍掉的
代码
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 (?, ?)
所以一对多的那个地方可以省略也是这个原有了