论坛首页 Java企业应用论坛

提问:如何使用hibernate设置基础表和主表之间的关系(一对多)

浏览 9404 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-03-22  
参看hibernate参考文档,对于一对多的数据库表关系,一般都作双向的一对多关系(Bidirectional one to many),但是对于有很多基础表的关联表,也是采用这样的解决方案?

举个例子,如附件中的表关系,如果采用双向的一对多来建立对象关系,是否不恰当呢?

我想能不能把基础表独立,不建立关联,如国家表写成如下的映射文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="test.application.entity.Country" table="COUNTRY">
<id name="id" column="COUNTRY_ID" type="string">
<generator class="uuid.hex"/>
</id>
<property name="twoCode" column="COUNTRY_TWO_CODE" type="string" length="2"/>
<property name="threeCode" column="COUNTRY_THREE_CODE" type="string" length="3"/>
<property name="chineseName" column="COUNTRY_CHINESE_NAME" type="string" length="200"/>
<property name="englishName" column="COUNTRY_ENGLISH_NAME" type="string" length="200"/>
</class>
</hibernate-mapping>


至于图中的船舶资料表,还是建立与基础表之间的关联,如:
&#65279;<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="test.application.entity.Ship" table="SHIP">
<id name="shipCallId" column="SHIP_CALL_ID" type="string">
<generator class="uuid.hex"/>
</id>
<many-to-one 
  name="country" 
  class="test.application.entity.Country" 
  column="COUNTRY_ID"  
  cascade="none" 
  outer-join="auto" 
  update="true" 
  insert="true"
  not-null="true"/>
........................
</class>
</hibernate-mapping>


这样的做法是否可行?谢谢!
   发表时间:2004-03-22  
引用

对于一对多的数据库表关系,一般都作双向的一对多关系(Bidirectional one to many)

没这种说法。
0 请登录后投票
   发表时间:2004-03-22  
yehs220 写道
引用

对于一对多的数据库表关系,一般都作双向的一对多关系(Bidirectional one to many)

没这种说法。



我想向你请教:如果数据库中某一个表有很多的基础表关联,一般对应关系是一对多,如上面的图中描述的那样,那映射应该怎么写呢?能不能说的详细些。我总觉得上面写的映射有问题,谢谢
0 请登录后投票
   发表时间:2004-03-22  
你写的映射应该没什么问题吧。

我想应该不用在Country的映射中写上one-to-many吧?
(如果你有n个表都和这个基础表关联,那你就要写n个one-to-many了!)
如果你认为你需要country.getShips()...这样的功能,那你就写上。(其实写一个简单的hql就能实现了)

采用单向还是双向完全取决于你的实际需求,唯一的例外是
单向的one-to-many可能会违反外键约束,或者会影响性能,
这种情况就会迫使你用双向的关联。
0 请登录后投票
   发表时间:2004-03-23  
谢谢yehs220的热心答复!

你是这样认为的:对于上述这样的情况一般只要建立多对一的映射关联,因为country.getShips()这样的需求一般不需要,有的话也是直接使用Hibernate查询。添加记录时先创建对象对应的数据库记录,然后修改对象到基础资料的引用。

至于外键约束性,可以在删除基础表资料时先判断是否存在对此基础资料的引用,如果存在引用,则删除操作取消,多了一个判断是否存在引用的操作。
你看我这样理解是否正确?


还有一个小问题,可能有点跑题
在使用hibernate直接生成数据库表结构和表关系时,我发现有个小问题,不能生成char(20)这样的字段类型(SQL Server 2000, M$的JDBC驱动),譬如下面的形式

    <property name="chineseName" column="SHIP_CHINESE_NAME" type="character" length="20"/>


生成的数据库字段类型是这样的

char(1);


使用char字段类型,主要是考虑性能:一般来说char建立索引比varchar类型性能要好,在hibernate论坛上也讨论了
http://forum.hibernate.org/viewtopic.php?t=927743

不知道大家有没有遇到过这样的情况,是不是我的写法有问题。
0 请登录后投票
论坛首页 Java企业应用版

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