继承关系
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>
<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>@OneToOne(mappedBy,cascade)
<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 )@ManyToOne/@OneToMany(mappedBy,cascade) @JoinColumn(可选)
双向:主键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)