论坛首页 入门技术论坛

初学spring,带来同时操作两个表的问题,见笑!

浏览 2758 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-01-08  
如下两个表,一对多的关系:riskDutyFacotr<->riskDutyFactorUnit
---------------------------
create table riskDutyFactor
(
   ID                   INTEGER                not null,
   factorName         CHAR(20),
   specComments       VARCHAR(50),
   sign               CHAR(1),
   constraint P_riskDutyFactor_I primary key (ID)
);

--==============================================================
-- Table: riskDutyFactorUnit
--==============================================================
create table riskDutyFactorUnit
(
   ID                   INTEGER                not null,
   rdf_ID             INTEGER,
   factorUnit         CHAR(20),
   value              CHAR(30),
   constraint P_Key_1 primary key (ID)
);
---------------------------
service中操作两个表的代码如下:
//保存一个责任要素
public void saveRiskdutyfactor(String factorName,String factorSign,String factorUnit,String factotValue){
riskDutyFactor.setFactorname(factorName);
if(factorSign.equals("factorSign")){
riskDutyFactor.setSign("0");
}else{
riskDutyFactor.setSign("1");
}

riskDutyFactorUnit.setFactorunit(factorUnit);
riskDutyFactorUnit.setValue(factotValue);
// if(riskDutyFactor.getRiskdutyfactorunits().add(riskDutyFactorUnit)==true){
// System.out.println("success add children! ");
// }经过测试是可以执行该段代码的
riskDutyFactor.getRiskdutyfactorunits().add(riskDutyFactorUnit);
this.getRiskDutyFactorDAO().saveRiskdutyfactor(riskDutyFactor);
this.getRiskDutyFactorUnitDAO().saveRiskDutyFactorUnit(riskDutyFactorUnit);
}
----------------------
spring配置文件为:
<bean id="proxyTemplate" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

<bean id="riskDutyFactorTarget" parent="proxyTemplate">
<property name="target">
<bean class="com.gi.service.defineFactor.spring.RiskDutyFactorServiceImpl">
<property name="riskDutyFactorDAO">
<ref local="riskDutyFactorDAO" />
</property>
<property name="riskDutyFactorUnitDAO">
<ref local="riskDutyFactorUnitDAO" />
</property>
</bean>
</property>
</bean>
-----------------------
可以成功执行日志为:
Hibernate: values nextval for S_riskDutyFactor
Hibernate: values nextval for S_riskDutyFactorUnit
Hibernate: insert into XFLIU.RISKDUTYFACTOR (FACTORNAME, SIGN, ID) values (?, ?, ?)
Hibernate: insert into XFLIU.RISKDUTYFACTORUNIT (RDF_ID, FACTORUNIT, VALUE, ID) values (?, ?, ?, ?)
但是没有将两个表关联起来,为什么?我一直怀疑是我spring的配置有问题,两个dao在两个session里执行的,对吗?如果正确我应该怎么改进?谢谢大家!
   发表时间:2007-01-08  
你确定两个数据库表之间也已经建立了关联(即外键关联)了吗?

这样的问题你应该首先想到参阅Hibernate自带的参考文档,里面就父子关系的维护有相当细致的论述(同时举出了一些非常实用的例子)。它可以帮助你找到更加优雅和易读的方法来维护实体之间的各种关系。

这里就有一个现成的例子:
http://www.hibernate.org/hib_docs/v3/reference/en/html/example-parentchild.html#example-parentchild-bidir

同时,个人认为你的Service层包办了一些应该由DAO层来处理的细节,这样的情况应当尽量地少。

而且,建模的过程应当使用一些工具来保证各级别的统一性。如果是 [手动建数据库表+手动编写PO代码+手动书写配置文件] 这样“原始粗糙”的模式,将很难保证不出差错。
0 请登录后投票
   发表时间:2007-01-08  
谢谢回复.不过可以先看一下我的hbm文件
Riskdutyfactorunit.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">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="com.gi.po.Riskdutyfactorunit" table="RISKDUTYFACTORUNIT" schema="XFLIU">
        <id name="id" type="integer">
            <column name="ID" />
            <generator class="sequence" />
        </id>
        <many-to-one name="riskdutyfactor" class="com.gi.po.Riskdutyfactor" fetch="select">
            <column name="RDF_ID" />
        </many-to-one>

        <property name="factorunit" type="string">
            <column name="FACTORUNIT" length="20" />
        </property>
        <property name="value" type="string">
            <column name="VALUE" length="30" />
        </property>
    </class>
</hibernate-mapping>
----------
Riskdutyfactor.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">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="com.gi.po.Riskdutyfactor" table="RISKDUTYFACTOR" schema="XFLIU">
        <id name="id" type="integer">
            <column name="ID" />
            <generator class="sequence" />
        </id>
        <property name="factorname" type="string">
            <column name="FACTORNAME" length="20" />
        </property>
        <property name="sign" type="string">
            <column name="SIGN" length="1" />
        </property>
        <set name="riskdutyfactorunits" inverse="true">
            <key>
                <column name="RDF_ID" />
            </key>
            <one-to-many class="com.gi.po.Riskdutyfactorunit" />
        </set>
    </class>
</hibernate-mapping>

以上文件我是直接通过工具生成的,并进行了核对.应该没有问题.既然是通过工具生成的,那我数据库这两个表应该有关联的?对吧?
0 请登录后投票
   发表时间:2007-01-08  
引用
Hibernate: insert into XFLIU.RISKDUTYFACTORUNIT (RDF_ID, FACTORUNIT, VALUE, ID) values (?, ?, ?, ?)

难道这里insert的RDF_ID是个空值?

我想你是漏了什么:
child.setParent(parent);  -->  riskDutyFactorUnit.setRiskDutyFactor(riskDutyFactor);



P.s. 我仍然坚持你应当参考一下那个Hibernate自带的例子,因为在那之后你会觉得原来根本就没有必要来论坛费事发帖。
0 请登录后投票
   发表时间:2007-01-09  
谢谢你的建议,我正在看中.其实以前也开发过相关项目,不过可能有些没有太深入,写完程序就完事了吧.
谢谢.
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics