Hibernate的对象关系

继承关系

1.每个子类一个数据表

xml:直接在子类的hbm.xml文件中包含子类和父类的属性

anno:父类@MappedSuperclass

2.每个类一个数据表

xml:父类的hbm.xml文件中用<joined-subclass>包含子类,其中<joined-subclass>的<key column="子类">

anno:父类@Inheritance(strategy=InheritanceType.JOINED) 子类@PrimaryKeyJoinColumn(name="")

3.共享数据表

一个表,用一个字段区分不同对象

anno:父类@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

@DiscriminatorColumn(name="".discriminatorType=DiscriminatorType.STRING)

子类@DiscriminatorValue("")

在many-to-one一方增加外键

铁律:双向关系在程序中要设定双向关联
铁律:双向mappedBy

只设定ManyToOne可以,只设定OneToMany不行


基于外键的单向一对一和单向多对一几乎相同,唯一不同的就是单向一对一的外键字段具有唯一性约束.


cascade和inverse
inverse="true"表示根据那一方的状态来更新同步数据库,一般用在<set><one-to-many>(原则:控制权交给多方)
cascade来控制save()的时候是否级联,如果cascade的值不包括save-update,级联对象就不会同步到数据库(还是临时对

象),所以会报错....如果casecade的值不包括save-update和set中的inverse="false",保存多方A1的时候由自己控制,

级联保存一方B,一方B又级联保存另外一个多方A2,而A2没有保存出于临时状态,所以会报错
    

二。其他配置

级联(cascade)属性
1、CascadeType.ALL(包括增、删、改、查,联动操作),其实查不算在内,查Fetch

2、CascadeType.MERGE(合并的join)--不重要

3、CascadeType.PERSIST(保存的时候在级联)

4、CascadeType.REFRESH(刷新说明:比如现在我查询出了数据,另外一个人在我查询数据之后,他对数据做了修改,这是才会级联上,hibernate会自动刷新我查询出来的数据)

5、CascadeType.REMOVE (只要在删除操作时才会级联)

6、我们一般都只设置CascadeType.ALL就OK了,

7、Cascade不是必须的,他的作用只是可以让我们快速的开发,我们也可以通过手动增、删、改、查
Fetch捉取策略

1、FetchType.EAGER(渴望的,希望马上得到)
a) 一对多关系,比如通过get()方法来get出一的一端,他之后会出一条SQL语句,不会自动去查询多的一端,如果设置FetchType.EAGER,会讲他的关联对象查询出来
b) 如果是load的话,他不会发出SQL语句,因为load支持延迟加载,只有真正获取数据时才会发SQL

2、FetchType.LAZY(懒加载)
a) 只有真正获取数据时才发出SQL语句
3、默认是:FetchType.LAZY(一对多)
4、默认是:FetchType.EAGER(多对一)
5、一般使用默认就可以了


一对一外键:
单向:
<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <many-to-one name="address" 
        column="addressId" 
        unique="true"
        not-null="true"/>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
</class>

create table Person ( personId bigint not null primary key, addressId bigint not null unique )
create table Address ( addressId bigint not null primary key )
  

//one-to-one是留给少的一方
双向:
<class name="Person">                
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <many-to-one name="address" 
        column="addressId" 
        unique="true"
        not-null="true"/>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
   <one-to-one name="person" 
        property-ref="address"/>
</class>

create table Person ( personId bigint not null primary key, addressId bigint not null unique )
create table Address ( addressId bigint not null primary key )


一对一主键:
单向:    
<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
</class>

<class name="Address">
    <id name="id" column="personId">
        <generator class="foreign">
            <param name="property">person</param>
        </generator>
    </id>
    <one-to-one name="person" constrained="true"/>
    <!--constrained="true"表明address表的ID主键同时作为外键参照person表-->
</class>
create table Person ( personId bigint not null primary key )
create table Address ( personId bigint not null primary key )
 
双向:
<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <one-to-one name="address"/>
</class>
@OneToOne(mappedBy,cascade)
<class name="Address"> <id name="id" column="personId"> <generator class="foreign"> <param name="property">person</param> </generator> </id> <one-to-one name="person" constrained="true"/></class>
@OneToOne(mappedBy,cascade)
create table Person ( personId bigint not null primary key )create table Address ( personId bigint not null primary key )有双向就要有mappedBy/property-ref/inverse而且要"多指向少"set不重复多对一:单向:<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <many-to-one name="address" column="addressId" not-null="true"/></class>
@ManyToOne/@OneToMany(mappedBy,cascade)
@JoinColumn(可选)
<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id></class>create table Person ( personId bigint not null primary key, addressId bigint not null )create table Address ( addressId bigint not null primary key )





 双向:主键column务必一致<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <many-to-one name="address" column="addressId" not-null="true"/></class><class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> <set name="people" inverse="true"> <key column="addressId"/> <one-to-many class="Person"/> </set></class>create table Person ( personId bigint not null primary key, addressId bigint not null )create table Address ( addressId bigint not null primary key )一对多:单向:<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <set name="addresses" inverse="true"> <key column="personId" not-null="true"/> <one-to-many class="Address"/> </set></class><class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id></class>create table Person ( personId bigint not null primary key )create table Address ( addressId bigint not null primary key, personId bigint not null )双向:<class name="Person"> <id name="id"/> ... <many-to-one name="address" column="addressId" not-null="true" insert="false" update="false"/></class>---------------------------------------------------------------------------------------------------------------------<class name="Address"> <id name="id"/> ... <list name="people"> <key column="addressId" not-null="true"/> <list-index column="peopleIdx"/> <one-to-many class="Person"/> </list></class>双向多对多1.cascade属性为save-update2.一方inverse="true",另一方inverse="false" (默认false)3.设置双方的关联关系\

@ManyToMany(targetEntity,cascade)
@JoinTable(name,joinColumns={@JoinColumn},inverseJoinColumn={@JoinColumn})

@ManyToMany(cascade,mappedBy,targetEntity)





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值