永发信息网

hibernate的映射关系

答案:1  悬赏:0  手机版
解决时间 2021-03-22 18:33
一对一,多对多,多对一,
最佳答案
多对一(many-to-one)
通过many-to-one元素,可以定义一种常见的与另一个持久化类的关联。 这种关系模型是多对一关联(实际上是一个对象引用-译注):这个表的一个外键引用目标表的 主键字段。

name="propertyName"
column="column_name"
class="ClassName"
cascade="cascade_style"
fetch="join|select"
update="true|false"
insert="true|false"
property-ref="propertyNameFromAssociatedClass"
access="field|property|ClassName"
unique="true|false"
not-null="true|false"
optimistic-lock="true|false"
lazy="proxy|no-proxy|false"
not-found="ignore|exception"
entity-name="EntityName"
formula="arbitrary SQL expression"
node="element-name|@attribute-name|element/@attribute|."

embed-xml="true|false"
index="index_name"
unique_key="unique_key_id"
foreign-key="foreign_key_name"

/>
name: 属性名。

column (可选): 外间字段名。它也可以通过嵌套的 元素指定。

class (可选 - 默认是通过反射得到属性类型): 关联的类的名字。

cascade(级联) (可选): 指明哪些操作会从父对象级联到关联的对象。

fetch (可选 - 默认为 select): 在外连接抓取(outer-join fetching)和序列选择抓取(sequential select fetching)两者中选择其一。

update, insert (可选 - 默认为 true) 指定对应的字段是否包含在用于UPDATE 和/或 INSERT 的SQL语句中。如果二者都是false,则这是一个纯粹的 “外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到 或者通过trigger(触发器)、或其他程序生成。

property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。 如果没有指定,会使用对方关联类的主键。

access (可选 - 默认是 property): Hibernate用来访问属性的策略。

unique (可选): 使用DDL为外键字段生成一个唯一约束。此外, 这也可以用作property-ref的目标属性。这使关联同时具有 一对一的效果。

not-null (可选): 使用DDL为外键字段生成一个非空约束。

optimistic-lock (可选 - 默认为 true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。

lazy (可选 - 默认为 proxy): 默认情况下,单点关联是经过代理的。lazy="no-proxy"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。 lazy="false"指定此关联总是被预先抓取。

not-found (可选 - 默认为 exception): 指定外键引用的数据不存在时如何处理: ignore会将行数据不存在视为一个空(null)关联。

entity-name (可选): 被关联的类的实体名。

formula (可选): SQL表达式,用于定义computed(计算出的)外键值。

cascade属性设置为除了none以外任何有意义的值, 它将把特定的操作传递到关联对象中。这个值就代表着Hibernate基本操作的名称, persist, merge, delete, save-update, evict, replicate, lock, refresh, 以及特别的值delete-orphan和all,并且可以用逗号分隔符 来组合这些操作,例如,cascade="persist,merge,evict"或 cascade="all,delete-orphan"。更全面的解释请参考第 10.11 节 “传播性持久化(transitive persistence)”. 注意,单值关联 (many-to-one 和 one-to-one 关联) 不支持删除孤儿(orphan delete,删除不再被引用的值).

一个典型的简单many-to-one定义例子:


property-ref属性只应该用来对付遗留下来的数据库系统, 可能有外键指向对方关联表的是个非主键字段(但是应该是一个惟一关键字)的情况下。 这是一种十分丑陋的关系模型。比如说,假设Product类有一个惟一的序列号, 它并不是主键。(unique属性控制Hibernate通过SchemaExport工具进行的DDL生成。)


那么关于OrderItem 的映射可能是:


当然,我们决不鼓励这种用法。

如果被引用的唯一主键由关联实体的多个属性组成,你应该在名称为的元素 里面映射所有关联的属性。

假若被引用的唯一主键是组件的属性,你可以指定属性路径:


5.1.11. 一对一
持久化对象之间一对一的关联关系是通过one-to-one元素定义的。

name="propertyName"
class="ClassName"
cascade="cascade_style"
constrained="true|false"
fetch="join|select"
property-ref="propertyNameFromAssociatedClass"
access="field|property|ClassName"
formula="any SQL expression"
lazy="proxy|no-proxy|false"
entity-name="EntityName"
node="element-name|@attribute-name|element/@attribute|."

embed-xml="true|false"
foreign-key="foreign_key_name"
/>
name: 属性的名字。

class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。

cascade(级联) (可选) 表明操作是否从父对象级联到被关联的对象。

constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。 这个选项影响save()和delete()在级联执行时的先后顺序以及 决定该关联能否被委托(也在schema export tool中被使用).

fetch (可选 - 默认设置为选择): 在外连接抓取或者序列选择抓取选择其一.

property-ref: (可选) 指定关联类的属性名,这个属性将会和本类的主键相对应。如果没有指定,会使用对方关联类的主键。

access (可选 - 默认是 property): Hibernate用来访问属性的策略。

formula (可选):绝大多数一对一的关联都指向其实体的主键。在一些少见的情况中, 你可能会指向其他的一个或多个字段,或者是一个表达式,这些情况下,你可以用一个SQL公式来表示。 (可以在org.hibernate.test.onetooneformula找到例子)

lazy (可选 - 默认为 proxy): 默认情况下,单点关联是经过代理的。lazy="no-proxy"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。 lazy="false"指定此关联总是被预先抓取。注意,如果constrained="false", 不可能使用代理,Hibernate会采取预先抓取!

entity-name (可选): 被关联的类的实体名。

有两种不同的一对一关联:

主键关联

惟一外键关联

主键关联不需要额外的表字段;如果两行是通过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值!

比如说,对下面的Employee和Person进行主键一对一关联:



现在我们必须确保PERSON和EMPLOYEE中相关的字段是相等的。我们使用一个被成为foreign的特殊的hibernate标识符生成策略:




employee


...
class="Employee"
constrained="true"/>

一个刚刚保存的Person实例被赋予和该Person的employee属性所指向的Employee实例同样的关键字值。

另一种方式是一个外键和一个惟一关键字对应,上面的Employee和Person的例子,如果使用这种关联方式,可以表达成:


如果在Person的映射加入下面几句,这种关联就是双向的:



多对多分解成多对一
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
长1米2宽1米高60厘米的罐能放多少肉
炒股周末搞笑祝福短信,周末祝福短信
地球绕太阳的轨道为什么是椭圆的,不是圆的
王者荣耀项羽皮肤是霸王别姬出的快些还是海滩
阀门M+N N+L代表是什么
轨枕板起道器哪里有卖的
单选题对下列语句理解不恰当的一项是A.“他只
前进大街/建国路(路口)地址有知道的么?有点
心口最近老是疼痛是怎么回事?
风行汽车质量怎么样。
为什么东芝移动硬盘变成“ESD-USB”了?
黑发好还是有颜色的头发好看?
金太阳窗帘布匹零售地址在什么地方,想过去办
PH计与PH试纸哪个更准确
如图所示,绝缘弹簧的下端固定在光滑斜面底端
推荐资讯
在左右两个等体积的塑料瓶中,分别盛有等体积
邯郸廉租房去哪申请,郑州中原区申请廉租房需
贷款45万,分18年还,4厘9利息,每月应还多少
岳阳到石牛寨怎么走,从岳阳市到石牛寨怎么坐
高等数学里取整数的运算符号是什么是用字母表
三(1)班有60个同学,如果平均分成三组,每
“合抱之木,生子毫未:九层之台,起于垒土”
高中语文的诗词,高中语文所有要背的诗词,课
wfan 管理员密码是什么
给长辈送礼送什么酒好,送什么,,,。。,保
西安和延安哪个大???
财务指标分析是一年各指标分析还是几年各指标
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?