您的位置:首页 > 其它

hibernate小记

2015-01-30 13:18 204 查看
1.不映射到数据库里 :@transient (annotation中),不写(xml中)

2.更改日期精度:@temporal(temporal.Date),  type="date"

3.映射枚举类型:@Enumerated(EnumType.STRING)  --EnumType.ORDINAL (枚举的下标值)

4.ID生成策略:@GenerateValue(strategy=GenerationType.IDENTITY)    --auto;Identity;sequence --@SequenceGenerator ;table  --TableGenerator ,<generator class="uuid">  -- identity(MySql)  sequence(Oracle)
   native(由底层方言产出);

类上加 :@SequenceGenerator(name="xxxSequence",sequencename="xxxSequence_DB"),get方法上加 
GenerateValue(strategy=GenerationType.SEQUENCE,generator="xxxSequence")   ---指定生成的序列名以及指定所用的序列

5.联合主键:(1)新建一个类用于存放把主键 (2)实现java.io.Serializable(标记行接口,不用实现任何方法)   --内存若满,需要实现序列化,才能够写到虚拟内存  (3)重写equals和hashcode

5.1 把主键类注解为@Embeddable,并且把组件属性注解为@Id

5.2 把组件属性注解为@EmbeddedId

5.3将类注解为@IdClass(XXX.class),且将复合id的get方法都设为@id   (常用)

<composite-id name="pk"  class="">

      <key-property  name="id"></key-property-id>

</composite-id>

6.opensession 始终打开一个新的session,需要手动close

getcurrentsession 在上下文中查找session,若没有,则创建,用途:用于界定事物边界,自动close

7.hibernate.current_session_context_class  取值有:jta   java Transaction api   | thread    线程   | managed  手工管理事物  | custom.class  自定义class管理事物

8.hibernate对象的三种状态:Transient (瞬态--内存中的一个对象,没id,缓存中没有)  Persistent(持久-- 内存中有,缓存中有,有id,数据库有)  Detached(托管--内存有,缓存有,数据库有,有id)

三种状态的区别在于1.有没有id   2.id在数据库中有没有   3.在内存中有没有(session缓存)

9.session--》接口,管理一个数据库的任务单元

10. save()     Transient==>Persistent

delete()      必须要有id    Persistent==>Transient

Load(Class,id)        Persistent

get(Class,id)             与load()的区别 使用get时候,会马上发出sql语句,获取对象,而使用load()时候,只会先获得一个代理,在需要使用的时候才会发出sql语句

update() ---更新Transient对象会报错,但是有id的Transient对象不会报错

===============更新部份修改的字段

(1)修改注解,在get方法上,@Column(updatable=false)

(2)在xml文件的<class上增加  dynamic-update="true">   --跨session时不顶用==》加上session.merge(对象)

(3)使用HQL语句

Query q=session.createQuery("HQL");

q.executeUpdate();

clear(): 无论load()或get(),都首先会查找缓存(一级缓存),如果没有,才会去数据库数据库查找,对用clear()方法可以强制清除session缓存

flush():强制让缓存的内容与数据库的内容作同步     FlushMode

11.schemaeExport(Configuration)    生成建表语句

12 一对一关系

(1)单向外键关联:

在一个类中有另一个类的引用

@onetoone

<mang-to-one name=""   column=""  class=""  unique="true">

改变生成的外键id名字:@JoinColunm(name="XXX")

(2)双向外键关联

A类中有B类的引用,B类中有A类的引用

两个属性上同时写上@onetoone

这时,若生成表,则会有两个外键,产生冗余,可以在其中一个的@onetoone改为@onetoone(mappedby=“”)

只要有双向关联,mapped属性必设

<mang-to-one name="A"   column=""  class=""  unique="true">

<one-to-one name=""   column=""  class=""  property-ref=“A”>

(3)单向主键关联

在一个类中增加另一个类的引用

在属性上增加以下注解

@onetoone

@PrimaryKeyJoinColumn

<one-to-one name=""  constrained="true">

(4)双向主键关联

A类有B类的引用,B类有A类的引用

@onetoone

@@PrimaryKeyJoinColumn

<one-to-one name=""   column=""  class=""  property-ref=“A”>

(5)联合主键

A类中有B类的引用

在getXXX方法上加上:@onetoone

@joinColumns({

    @joinColumn(name="",referencedColumn=""),

    @joinColumn(name="",referencedColumn="")

})

(6)组件映射

在get方法上写@Embedded

<component  name="">

  <property name=""></property>

  <property name=""></property>

</component>

(7)多对一的单向关联

在多的一方加上另一方的引用

在getXXX上增加以下注解:

@manytoone

@joinColumn(name="")

<many-to-one name="" column=""/ >

(8)一对多的单向关联

在一方存在多的一方的引用:Set<泛型>

在getXXX方法上加上:@onetomany   在默认的情况下会被当前多对多的特殊情况,生成3张表,一张为中间表

再加@joinColumn(name="")   加上此注解,会在数据库表里,多的一方加上外键

<set name="">

   <key column=“”>

    <one-to-many class=""  >

</set>

(9)一对多,多对一双向关联

在双方都有对方的引用

在一的一方:

@onetomany(mapped=“”)

在一的一方:

<set name="">

   <key column=“”>

    <one-to-many class=""  >

</set>

在多的一方:

<many-to-one name=""  column="">          ==>column 相当于FK名字

(9)多对多关联

单向关联:

一方拥有另一方的引用

@manytomany

@JoinTable(
name="TrainedMonkeys",
joinColumns = @JoinColumn( name="trainer_id"),
inverseJoinColumns = @JoinColumn( name="monkey_id")
)


<set name="" table=“”>

   <key column=“”>

    <many-to-many class="" column=“” >

</set>

(10)多对多关联

双方各有对方的引用

@manytomany(mapped="")

<set name="" table=“”>

   <key column=“”>

    <many-to-many class="" column=“” >

</set>

13保存时(save()).默认情况下,不产生级联关系

可在引用getXXX方法上加上以下注解

可设置@manytoone(cascade={cascadeType.All})

CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法!

CascadeType.REMOVE:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据!

CascadeType.MERGE:级联更新,当调用了Merge()方法,如果Order中的数据改变了会相应的更新OrderItem中的数据,

CascadeType.ALL:包含以上所有级联属性。

(注:以上几种级联操作,只能实在满足数据库的约束时才能生效,比如上边的Order和OrderItem存在主外键关联所以执行REMOVE()方法时是不能实现级联删除的)

CascadeType.PERSIST:级联保存,当调用了Persist() 方法,会级联保存相应的数据

双向关系要在程序中设置双向关联

14.查询时,manytoone,在多方,可以把一的那方取出来,在一方,不会将多方取出

@onetomany(fetch=FetchType.eager)

15.Update

<set name=""   inverse="true">                 //       逆转,关联关系在对方那边设,取我,就不用取对方,取对方,就不用取我

   <key column=“”>

    <many-to-many class="" column=“” >

</set>

16.Merge=save()+update

17.(1)为了防止级联删除,可以打破关系  (2)可用hql

18.集合映射

使用Set与list的区别在 于排序,当需要进行排序时,使用List

加注解:默认按主键@Orderby

@Orderby(name ASC)

Map:使用Map时需要加上以下注解:@MapKey(name="")

19.继承映射

(1)single_table模式:

在父类中:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="planetype",
discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue("Plane")

在子类中:

@Entity
@DiscriminatorValue("A320")

(2)每个具体的类一张表:

父类:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

ID生成策略要么使用table,要么手动

子类:不用设

(3)joined模式

父类中写:
@Entity
@Inheritance(strategy=InheritanceType.JOINED)


子类:不用写

20. NativeSQL(本地SQL)>HQL>EJBQL(JPQL)>QBC(Query By  Cretira)>QBE(Query By Example)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: