1. 数据库中一个字段的默认值设为0,当用hibernate插入数据时,没有对该字段进行操作,结果该字段居然不是0,而是空。后来google了一下,发现应该在.hbm.xml文件中添加一些参数定义(示例中的红色部分),具体如下:
  2. <hibernate-mapping>
  3.     <class name="com.tom.hibernate.EbayItem" table="EBAY_ITEM" schema="API_USER" dynamic-insert="true" dynamic-update="true">
  4. .......
  5. ........
  6. </class>
  7. </hibernate-mapping>
  8. 在我们熟悉的Hibernate映射文件中也大有乾坤,很多值得我注意的地方。
  9. Hibernate的映射文件的class tag使用dynamic-insertdynamic-update,可以优化生成的SQL语句,提高SQL执行效率,最终可以提高系统性能。
  10. 运行测试后,此时会生成完整的SQL语句(注意将hibernate属性show_sql设置成true)。
  11. ================testSaveUser=================
  12. Hibernate: insert into Users (age, firstname, lastname) values (?, ?, ?)
  13. ================testUpdateUser=================
  14. Hibernate: insert into Users (age, firstname, lastname) values (?, ?, ?)
  15. Hibernate: update Users set age=?, firstname=?, lastname=? where ID=?
  16. 如果我们在<class ...>中加上 dynamic-insert="true" dynamic-update="true",变成如下。
  17. <class name="model.User" table="Users"  dynamic-insert="true" dynamic-update="true">
  18. 再次运行测试类,就会发现生成的SQL中涉及的字段只包含User类中修改的属性所对应的表字段。
  19. ================testSaveUser=================
  20. Hibernate: insert into Users (age) values (?)
  21. ================testUpdateUser=================
  22. Hibernate: insert into Users (age) values (?)
  23. Hibernate: update Users set firstname=? where ID=?
  24. 如果一个表的结构很复杂,字段很多的情况下,使用dynamic-insertdynamic-update能够性能上的少许提升。
  25. 下面是有关其它配置的说明
  26. Hibernate允许我们在映射文件里控制insertupdate语句的内容.比如在映射文件中<property 元素中的update属性设置成为false,那么这个字段,将不被包括在基本的update语句中,修改的时候,将不包括这个字段了.insert同理.dynamic动态SQL语句的配置也是很常用的.下面介绍配置SQL语句的具体属性:
  27.       1)<property>元素 insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入,默认true
  28.       2)<property>元素 update属性:设置为false,在update语句中不包含这个字段,表示永远不会被修改,默认true
  29.       3)<class>元素 mutable属性:设置为false就是把所有的<property>元素的update属性设置为了false,说明这个对象不会被更新,默认true
  30.       4)<property>元素 dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false
  31.       5)<property>元素 dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false
  32.       6)<class>元素 dynamic-insert属性:设置为true,表示把所有的<property>元素的dynamic-insert属性设置为true,默认false
  33.       7)<class>元素 dynamic-update属性:设置为true,表示把所有的<property>元素的dynamic-update属性设置为true,默认false
  34.       Hibernate生成动态SQL语句的消耗的系统资源(比如CPU,内存等)是很小的,所以不会影响到系统的性能,如果表中包含N多字段,建议把dynamic-update属性和insert属性设置为true,这样在插入和修改数据的时候,语句中只包括要插入或者修改的字段.可以节省SQL语句的执行时间,提高程序的运行效率.
  35.  
  36. hibernate 常用注解说明。
  37. @content ejb3注解的API定义在javax.persistence.*包里面。   
  38.    
  39. 注释说明:   
  40. @Entity —— 将一个类声明为一个实体bean(即一个持久化POJO类)   
  41. @Id —— 注解声明了该实体bean的标识属性(对应表中的主键)。   
  42. @Table —— 注解声明了该实体bean映射指定的表(table),目录(catalog)和schema的名字   
  43. @Column —— 注解声明了属性到列的映射。该注解有如下的属性   
  44. name 可选,列名(默认值是属性名)   
  45. unique 可选,是否在该列上设置唯一约束(默认值false   
  46. nullable 可选,是否设置该列的值可以为空(默认值false   
  47. insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true   
  48. updatable 可选,该列是否作为生成的update语句中的一个列(默认值true   
  49. columnDefinition 可选,为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植)   
  50. table 可选,定义对应的表(默认为主表)   
  51. length 可选,列长度(默认值255   
  52. precision 可选,列十进制精度(decimal precision)(默认值0   
  53. scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0   
  54. @GeneratedValue —— 注解声明了主键的生成策略。该注解有如下属性   
  55. strategy 指定生成的策略(JPA定义的),这是一个GenerationType。默认是GenerationType. AUTO   
  56.    GenerationType.AUTO 主键由程序控制   
  57. GenerationType.TABLE 使用一个特定的数据库表格来保存主键   
  58. GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型)   
  59. GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列。(这个值要与generator一起使用)   
  60. generator 指定生成主键使用的生成器(可能是orcale中的序列)。   
  61. @SequenceGenerator —— 注解声明了一个数据库序列。该注解有如下属性   
  62. name 表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中   
  63. sequenceName 表示生成策略用到的数据库序列名称。   
  64. initialValue 表示主键初始值,默认为0.   
  65. allocationSize 每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50.   
  66. @GenericGenerator —— 注解声明了一个hibernate的主键生成策略。支持十三种策略。该注解有如下属性  
  67. name 指定生成器名称   
  68. strategy 指定具体生成器的类名(指定生成策略)。   
  69. parameters 得到strategy指定的具体生成器所用到的参数。   
  70.    其十三种策略(strategy属性的值)如下:   
  71.    1.native 对于orcale采用Sequence方式,对于MySQLSQL Server采用identity(处境主键生成机制),   
  72.     native就是将主键的生成工作将由数据库完成,hibernate不管(很常用)   
  73.     例:@GeneratedValue(generator = "paymentableGenerator")       
  74.          @GenericGenerator(name = "paymentableGenerator", strategy = "native")   
  75.      2.uuid 采用128位的uuid算法生成主键,uuid被编码为一个3216进制数字的字符串。占用空间大(字符串类型)。   
  76.       例:@GeneratedValue(generator = "paymentableGenerator")       
  77.          @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")   
  78.      3.hilo 要在数据库中建立一张额外的表,默认表名为hibernate_unque_key,默认字段为integer类型,名称是next_hi(比较少用)   
  79.       例:@GeneratedValue(generator = "paymentableGenerator")       
  80.          @GenericGenerator(name = "paymentableGenerator", strategy = "hilo")   
  81.      4.assigned 在插入数据的时候主键由程序处理(很常用),这是<generator>元素没有指定时的默认生成策略。等同于JPA中的AUTO   
  82.       例:@GeneratedValue(generator = "paymentableGenerator")       
  83.          @GenericGenerator(name = "paymentableGenerator", strategy = "assigned")   
  84.      5.identity 使用SQL ServerMySQL的自增字段,这个方法不能放到Oracle中,Oracle不支持自增字段,要设定sequence(MySQLSQL Server中很常用)。等同于JPA中的IDENTITY   
  85.       例:@GeneratedValue(generator = "paymentableGenerator")       
  86.          @GenericGenerator(name = "paymentableGenerator", strategy = "identity")   
  87.      6.select 使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)   
  88.       例:@GeneratedValue(generator = "paymentableGenerator")       
  89.          @GenericGenerator(name = "paymentableGenerator", strategy = "select")   
  90.      7.sequence 调用谨慎数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。   
  91.       例:@GeneratedValue(generator = "paymentableGenerator")      
  92.    @GenericGenerator(name = "paymentableGenerator", strategy = "sequence",       
  93.    parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })   
  94. 8.seqhilo 通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持Sequence的数据库,如Orcale(比较少用)    
  95. 例:@GeneratedValue(generator = "paymentableGenerator")      
  96.    @GenericGenerator(name = "paymentableGenerator", strategy = "seqhilo",       
  97.    parameters = { @Parameter(name = "max_lo", value = "5") })   
  98. 9.increnment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。   
  99. 例:@GeneratedValue(generator = "paymentableGenerator")       
  100.          @GenericGenerator(name = "paymentableGenerator", strategy = "increnment")   
  101.      10.foreign 使用另一个相关的对象的主键。通常和<one-to-one>联合起来使用。   
  102.      例:@Id       
  103.    @GeneratedValue(generator = "idGenerator")      
  104.    @GenericGenerator(name = "idGenerator", strategy = "foreign",       
  105.         parameters = { @Parameter(name = "property", value = "info") })       
  106.    Integer id;   
  107. @OneToOne    
  108. EmployeeInfo info;   
  109. 11.guid 采用数据库底层的guid算法机制,对应MySQLuuid()函数,SQL Servernewid()函数,ORCALErawtohex(sys_guid())函数等   
  110. 例:@GeneratedValue(generator = "paymentableGenerator")        
  111.    @GenericGenerator(name = "paymentableGenerator", strategy = "guid")    
  112. 12.uuid.hex uudi,建议用uuid替换   
  113.    例:@GeneratedValue(generator = "paymentableGenerator")        
  114.    @GenericGenerator(name = "paymentableGenerator", strategy = "uuid.hex")   
  115. 13.sequence-identity sequence策略的扩展,采用立即检索策略来获取sequence值,需要JDBC3.0JDK4以上(含1.4)版本   
  116.       例:@GeneratedValue(generator = "paymentableGenerator")      
  117.    @GenericGenerator(name = "paymentableGenerator", strategy = "sequence-identity",       
  118.         parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })    
  119.         
  120. @OneToOne 设置一对一个关联。cascade属性有五个值(只有CascadeType.ALL好用?很奇怪),分别是CascadeType.PERSIST(级联新建),CascadeType.REMOVE(级联删除),CascadeType.REFRESH(级联刷新),CascadeType.MERGE(级联更新),CascadeType.ALL(全部四项)   
  121.    方法一   
  122.    主表: ?@OneToOne(cascade = CascadeType.ALL)   
  123.      @PrimaryKeyJoinColumn 
  124.      public 从表类 get从表类(){return 从表对象}   
  125.      从表:没有主表类。   
  126.      注意:这种方法要求主表与从表的主键值想对应。   
  127. 方法二   
  128.      主表:?@OneToOne(cascade = CascadeType.ALL)   
  129.          @JoinColumn(name="主表外键") //这里指定的是数据库中的外键字段。   
  130.          public 从表类 get从表类(){return 从表类}   
  131.      从表:@OneToOne(mappedBy = "主表类中的从表属性")//例主表User中有一个从表属性是Heart类型的heart,这里就填heart   
  132.          public 主表类 get主表类(){return 主表对象}   
  133.      注意:@JoinColumn是可选的。默认值是从表变量名+"_"+从表的主键(注意,这里加的是主键。而不是主键对应的变量)。   
  134. 方法三   
  135.      主表:@OneToOne(cascade=CascadeType.ALL)   
  136.          @JoinTable( name="关联表名",   
  137.     joinColumns = @JoinColumn(name="主表外键"),   
  138.     inverseJoinColumns = @JoinColumns(name="从表外键")   
  139.          )   
  140.      从表:@OneToOne(mappedBy = "主表类中的从表属性")//例主表User中有一个从表属性是Heart类型的heart,这里就填heart   
  141.          public 主表类 get主表类(){return 主表对象}       
  142. @ManyToOne 设置多对一关联   
  143.    方法一          
  144.    @ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE})   
  145.    @JoinColumn(name="外键")   
  146.    public 主表类 get主表类(){return 主表对象}   
  147.    方法二   
  148.    @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})   
  149.    @JoinTable(name="关联表名"   
  150.    joinColumns = @JoinColumn(name="主表外键"),   
  151.    inverseJoinColumns = @JoinColumns(name="从表外键")   
  152.    )   
  153. @OneToMany 设置一对多关联。cascade属性指定关联级别,参考@OneToOne中的说明。fetch指定是否延迟加载,值为FetchType.LAZY表示延迟,为FetchType.EAGER表示立即加载   
  154.    方法一     使用这种配置,在为“一端”添加“多端”时,不会修改“多端”的外键。在“一端”加载时,不会得到“多端”。如果使用延迟加载,在读“多端”列表时会出异常,立即加载在得到多端时,是一个空集合(集合元素为0)。   
  155.    “一端”配置   
  156.    @OneToMany(mappedBy="“多端”的属性")   
  157.    public List<“多端”类> get“多端”列表(){return “多端”列表}   
  158.    “多端”配置参考@ManyToOne.        
  159.    方法二   
  160.    “一端”配置   
  161.    @OneToMany(mappedBy="“多端”的属性")   
  162.    @MapKey(name="“多端”做为Key的属性")   
  163.    public Map<“多端”做为Key的属性的类,主表类> get“多端”列表(){return “多端”列表}   
  164.    “多端”配置参考@ManyToOne.    
  165.    方法三 使用这种配置,在为“一端”添加“多端”时,可以修改“多端”的外键。   
  166.    “一端”配置   
  167.    @OneToMany 
  168.    @JoinColumn(name="“多端外键")    
  169.    public List<“多端类> get“多端列表(){return “多端列表}   
  170.    “多端配置参考@ManyToOne.

hibernate属性配置的更多相关文章

  1. 。。。Hibernate注解配置的注意事项。。。

    今天本来打算录视频的,突然遇到一个拦路虎,Hibernate注解配置,有一个注意点:要么都在属性上面注解配置,要么都在getXX()方法上面用注解配置,要不然就会报错: Caused by: org. ...

  2. ORM和Hibernate的配置方式

    分层体系结构: 逻辑上一般分为三层:表述层(提供与用户交互的界面).业务逻辑层(实现各种业务的逻辑).数据库层(负责存放和管理应用的持久性业务数据). 物理上一般分为两层:物理层(每一层都运行在网络上 ...

  3. Hibernate缓存配置

    一级缓存 Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveorupdate()等方法 及调用查询接口l ...

  4. Hibernate——hibernate的配置测试

    Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自 ...

  5. springBoot属性配置和使用

    Spring Boot 属性配置和使用 1.添加属性文件 application.properties (名字固定) 2.访问端口生效 3.更多配置参考 # ===================== ...

  6. Hibernate学习笔记2.1(Hibernate基础配置)

    Hibernate基础配置 1.<property name="hbm2ddl.auto">update</property> 在SessionFactor ...

  7. springboot快速入门(二)——项目属性配置(日志详解)

    一.概述 application.properties就是springboot的属性配置文件 在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring ...

  8. hibernate核心配置

    # hibernate核心配置 注意:  - hibernate.cfg.xml默认放在src目录下(这样可以自动加载该文件) - 必须配置的参数:   * 数据库的四大参数和方言  - 可选配置的参 ...

  9. Hibernate常见配置详细解释

      <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1. ...

随机推荐

  1. js 克隆数据 (数组的深浅拷贝)

    var a1 = [1,2,3]; var a2 = a1; a2[0] = 90; console.log(a1[0]) //90 解析:数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结 ...

  2. 洛谷——P2912 [USACO08OCT]牧场散步Pasture Walking(lca)

    题目描述 The N cows (2 <= N <= 1,000) conveniently numbered 1..N are grazing among the N pastures ...

  3. GRDB使用SQLite的WAL模式

    GRDB使用SQLite的WAL模式   WAL全称是Write Ahead Logging,它是SQLite中实现原子事务的一种机制.该模式是从SQLite 3.7.0版本引入的.再此之前,SQLi ...

  4. jenkins按版本发布maven项目

    1.先为java这个项目创建三个版本 vim pom.xml vim src/main/java/com/ghz/testweb/App.java git add . git commit -m &q ...

  5. BZOJ1006神奇的国度 弦圖染色 最大勢算法

    @[弦圖染色, 最大勢算法] Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA 相互认识,是简洁高效的.为了巩固三角 ...

  6. link2005 重复定义错误

    造成LNK2005错误主要有以下几种情况:  1.重复定义全局变量. 对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下.其实这是错误的,全局变量是针对整个工程的. 正 ...

  7. Java EE官方文档汇总

    Java EE是一个开发规范标准,各个容器厂商根据标准去实现,比如Tomcat等,其中Oracle通过标准用GlassFish去实现. 5:https://docs.oracle.com/javaee ...

  8. scala工具sbt的安装和使用;idea如何创建scala项目

    scala的sbt类似于java的maven mac:brew install sbt linux:yum Install sbt 或者下载二机制包 使用sbt需要想mvn一样搭建公司私服,不然,下载 ...

  9. Swift:闭包(Closures)

    一. 基本概念 闭包(Closures)是自包括的功能代码块,能够在代码中使用或者用来作为參数传值. 在Swift中的闭包与C.OC中的blocks和其他编程语言(如C#)中的lambda, java ...

  10. C# 将long类型写入二进制文件用bw.Write(num);将其读出用long num= br.ReadInt64();

    理由: 因为long类型是 System.Int64 (长整型,占 8 字节,表示 64 位整数,范围大约 -(10 的 19) 次方 到 10 的 19 次方) 而long BinaryReader ...