本人的论坛程序(风信论坛)中 有用到这样的结构
post 帖子表 userInfo 用户表
------------------------------------------------------------------
pid (int) 主键 userId(int) 主键
..... .....
userId (int)
现在要 获取 post 表数据的时候 同时获取 userId 关联的 userInfo 表数据, 也就是常用的inner join
解决方法:
- hibernate post.hbm.xml 增加如下节点: <many-to-one name="userInfo" column="userId" class="org.javawind.System.UserInfo" fetch="join" update="false" insert="false" cascade="none"/>
- Bean Post.java 增加 private UserInfo userInfo; 和 相应的 getter、setter
- HQL 写法: String SqlStr="From Post as p join fetch p.userInfo Order By pid Asc";
- jsp页面通过 el表达式 访问数据:${posy.xxx} 、${post.userInfo.xxx}
many-to-one 配置详解:
通过many-to-one元素,可以定义一种常见的与另一个持久化类的关联。 这种关系模型是多对一关联(实际上是一个对象引用-译注):这个表的一个外键引用目标表的 主键字段。
<many-to-one
name="propertyName" (1)
column="column_name" (2)
class="ClassName" (3)
cascade="cascade_style" (4)
fetch="join|select" (5)
update="true|false" (6)
insert="true|false" (6)
property-ref="propertyNameFromAssociatedClass" (7)
access="field|property|ClassName" (8)
unique="true|false" (9)
not-="true|false" (10)
optimistic-lock="true|false" (11)
lazy="true|proxy|false" (12)
not-found="ignore|exception" (13)
entity-name="EntityName" (14)
node="element-name|@attribute-name|element/@attribute|."
embed-xml="true|false"
/>
(1) name: 属性名。
(2) column (可选): 外间字段名。它也可以通过嵌套的 <column>元素指定。
(3) class (可选 - 默认是通过反射得到属性类型): 关联的类的名字。
(4) cascade(级联) (可选): 指明哪些操作会从父对象级联到关联的对象。
(5) fetch (可选 - 默认为 select): 在外连接抓取(outer-join fetching)和序列选择抓取(sequential select fetching)两者中选择其一。
(6) update, insert (可选 - defaults to true) 指定对应的字段是否包含在用于UPDATE 和/或 INSERT 的SQL语句中。如果二者都是false,则这是一个纯粹的 “外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到 或者通过trigger(触发器)、或其他程序。
(7) property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。 如果没有指定,会使用对方关联类的主键。
(8) access (可选 - 默认是 property): Hibernate用来访问属性的策略。
(9) unique (可选): 使用DDL为外键字段生成一个唯一约束。此外, 这也可以用作property-ref的目标属性。这使关联同时具有 一对一的效果。
(10) not- (可选): 使用DDL为外键字段生成一个非空约束。
(11) optimistic-lock (可选 - 默认为 true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。
(12) lazy (可选 - 默认为 proxy): 默认情况下,单点关联是经过代理的。lazy="true"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。 lazy="false"指定此关联总是被预先抓取。
(13) not-found (可选 - 默认为 exception): 指定外键引用的数据不存在时如何处理: ignore会将数据不存在作为关联到一个空对象()处理。
(14) entity-name (optional): 被关联的类的实体名。
cascade属性设置为除了none以外任何有意义的值, 它将把特定的操作传播到关联对象中。这个值就代表着Hibernate基本操作的名称, persist, merge, delete, save-update, evict, replicate, lock, refresh, 以及特别的值delete-orphan和all,并且可以用逗号分隔符 来合并这些操作,例如,cascade="persist,merge,evict"或 cascade="all,delete-orphan"。
1F / 2015-01-08 10:28:01
挺详细