Hibernate之配置文件

可持久化对象有以下三种状态:

临时状态(Transient):对象在保存进数据库之前为临时状态,这时数据库中没有该对象的信息,如果没有持久化,程序退出后临时状态的对象信息将会丢失。随时可能被垃圾回收器回收(在数据库中没有于之对应的记录,应为是new初始化),而执行save()方法后,就变为Persistent对象(持久性对象),没有纳入session的管理,内存中一个对象,没有ID,缓存中也没有

持久化状态(Persistent):对象在保存进数据库后或者从数据库加载后、并且没有脱离Session时为持久化状态,这时候数据库中有该对象的信息。由于还在Session中,持久化状态的对象可以执行任何有关数据库的操作,在数据库有存在的对应的记录,纳入session管理。在清理缓存(脏数据检查)的时候,会和数据库同步。内存中有、缓存中有、数据库有(ID)

分离状态(Detached):分离状态是对象曾经出于持久化状态,但是现在已经离开Session了。虽然分离状态的对象有id值,但是已经无法执行有关数据库的操作了。例如,读取延迟加载的集合属性,可能会抛出LazyInitalizeException。

技术分享

配置文件

Hibernate同时支持动态配置

 

XML配置

Configurationcfg = new Configuration().addResource(“com/clf/Cat.hbm.xml”);

//注解配置

Configuration cfg= new Configuration().addClass(com.clf.bean.cat.Class);

 

通过setProperty(“hibernate.dialect”,”org.hibernate.dialect.MySQLDialect”)类似的方法可以动态地设置Hibernate参数,还可以用addProperties(Propertiesp)批量的添加参数

常规配置

Hibernate的配置文件可以为XML或者properties文件,默认的配置文件名称为hibernate.cfg.xml或者hibernate.properties,位于classpath下面。properties文件中的参数是具有hibernate前缀的,而xml文件没有

hibernate.connection.driver_class= com.mysql.jdbc.Driver
hibernate.connection.url= jdbc:mysql://localhost:3306/hibernate?characterEncoding=UTF-8
hibernate.connection.username= root
hibernate.connection.password= admin
hibernate.dialect= org.hibernate.dialect.MySQLDialect
hibernate.show_sql= true
hibernate.hbm2ddl.auto= create
hibernate.current_session_context_class= thread

 

<?xml  version="1.0″ encoding="UTF-8″?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 

<session-factory> 

	<!--为true表示将Hibernate发送给数据库的sql显示出来 --> 
	<property name="show_sql">true</property> 

	<!-- SQL方言,这边设定的是MySQL --> 
	<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property> 

	<!-- 一次读的数据库记录数 --> 
	<property name="jdbc.fetch_size">50</property> 

	<!-- 设定对数据库进行批量删除 --> 
	<property name="jdbc.batch_size">30</property> 

	<!--驱动程序--> 
	<property name="connection.driver_class">com.mysql.jdbc.Driver</property> 

	<!--JDBC URL --> 
	<property name="connection.url">jdbc:mysql://localhost/dbname?characterEncoding=gb2312</property> 

	<!-- 数据库用户名--> 
	<property name="connection.username">root</property> 

	<!– 数据库密码–> 
	<property name="connection.password">root</property> 

	<!--映射文件 --> 
	<mapping resource="com/amigo/pojo/User.hbm.xml"/> 
	<mapping resource="com/amigo/pojo/Org.hbm.xml"/> 
</session-factory> 
</hibernate-configuration> 

 

配置数据源

<session-factory> 
<!--下面为JNDI的配置 --> 
<!-- 数据源的名称 --> 
<property name="connection.datasource">java:comp/env/jdbc/datasourcename</property> 

<!-- 数据源的提供者  -->
<property name="hibernate.jndi.url"></property>

<!-- 数据源的实现类  -->
<property name="hibernate.jndi.class"></property>

<!-- Hibernate的连接加载类 --> 
<property name="connection.provider_class">net.sf.hibernate.connection.DatasourceConnectionProvider</property> 

<property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property> 

<!--映射文件 --> 
<mapping resource="com/amigo/pojo/User.hbm.xml"/> 
<mapping resource="com/amigo/pojo/Org.hbm.xml"/> 
</session-factory>


c3p0连接池

c3p0连接池是Hibernate推荐使用的连接池,若需要使用该连接池时,需要将c3p0的jar包加入到classpath中。c3p0连接池的配置示例如下:

 

<session-factory> 
<property name="connection.driver_class">……</property> 

<!-- JDBC URL --> 
<property name="connection.url">……</property> 

<!-- 数据库用户名 --> 
<property name="connection.username">user</property> 

<!-- 数据库密码 --> 
<property name="connection.password">pass</property> 

<property name="c3p0.min_size">5</property> 

<property name="c3p0.max_size">20</property> 

<property name="c3p0.timeout">1800</property> 

<property name="c3p0.max_statements">50</property> 
……
</session-factory> 


在上述配置中,Hibernate根据配置文件生成连接,再交给c3p0管理。

Hibernate常规属性

hibernate.dialect  一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL.

取值full.classname.of.Dialect

 

hibernate.show_sql  输出所有SQL语句到控制台. 有一个另外的选择是把org.hibernate.SQL这个logcategory设为debug。

eg. true | false

 

hibernate.format_sql  在log和console中打印出更漂亮的SQL。

取值 true | false

 

hibernate.default_schema  在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上.

取值 SCHEMA_NAME

 

hibernate.default_catalog  在生成的SQL中, 将给定的catalog附加于非全限定名的表名上.

取值 CATALOG_NAME

 

hibernate.session_factory_name  SessionFactory创建后,将自动使用这个名字绑定到JNDI中.

取值jndi/composite/name

 

hibernate.max_fetch_depth  为单向关联(一对一, 多对一)的外连接抓取(outerjoin fetch)树设置最大深度. 值为0意味着将关闭默认的外连接抓取.

取值 建议在0到3之间取值

 

hibernate.default_batch_fetch_size  为Hibernate关联的批量抓取设置默认数量.

取值 建议的取值为4, 8, 和16

 

hibernate.default_entity_mode  为由这个SessionFactory打开的所有Session指定默认的实体表现模式.

取值 dynamic-map,dom4j, pojo

 

hibernate.order_updates  强制Hibernate按照被更新数据的主键,为SQL更新排序。这么做将减少在高并发系统中事务的死锁。

取值 true | false

 

hibernate.generate_statistics  如果开启,Hibernate将收集有助于性能调节的统计数据.

取值 true | false

 

hibernate.use_identifer_rollback  如果开启, 在对象被删除时生成的标识属性将被重设为默认值.

取值 true | false

 

hibernate.use_sql_comments  如果开启, Hibernate将在SQL中生成有助于调试的注释信息,默认值为false.

取值 true | false

 

Hibernate JDBC和连接(connection)属性

 

hibernate.jdbc.fetch_size  非零值,指定JDBC抓取数量的大小 (调用Statement.setFetchSize()).

 

hibernate.jdbc.batch_size  非零值,允许Hibernate使用JDBC2的批量更新.

取值 建议取5到30之间的值

 

hibernate.jdbc.batch_versioned_data  如果你想让你的JDBC驱动从executeBatch()返回正确的行计数 , 那么将此属性设为true(开启这个选项通常是安全的).同时,Hibernate将为自动版本化的数据使用批量DML. 默认值为false.

eg. true | false

 

hibernate.jdbc.factory_class  选择一个自定义的Batcher.多数应用程序不需要这个配置属性.

eg.classname.of.Batcher

 

hibernate.jdbc.use_scrollable_resultset  允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时,这个选项才是必要的,否则Hibernate会使用连接的元数据.

取值 true | false

 

hibernate.jdbc.use_streams_for_binary  在JDBC读写binary (二进制)或serializable(可序列化) 的类型时使用流(stream)(系统级属性).

取值 true | false

 

hibernate.jdbc.use_get_generated_keys  在数据插入数据库之后,允许使用JDBC3 PreparedStatement.getGeneratedKeys() 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题,请将此值设为false.默认情况下将使用连接的元数据来判定驱动的能力.

取值 true|false

 

hibernate.connection.provider_class  自定义ConnectionProvider的类名, 此类用来向Hibernate提供JDBC连接.

取值classname.of.ConnectionProvider

 

hibernate.connection.isolation  设置JDBC事务隔离级别. 查看java.sql.Connection来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别.

取值 1, 2, 4, 8

 

hibernate.connection.autocommit  允许被缓存的JDBC连接开启自动提交(autocommit)(不建议).

取值 true | false

 

hibernate.connection.release_mode  指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用after_statement,这样在每次JDBC调用后,都会主动的释放连接. 对于非JTA的连接, 使用after_transaction在每个事务结束时释放连接是合理的. auto将为JTA和CMT事务策略选择after_statement, 为JDBC事务策略选择after_transaction.

取值 auto (默认) |on_close | after_transaction | after_statement

 

注意,这些设置仅对通过SessionFactory.openSession得到的Session起作用。对于通过SessionFactory.getCurrentSession得到的Session,所配置的CurrentSessionContext实现控制这些Session的连接释放模式。请参阅第2.5 节“上下文相关的(Contextual)Session”。

 

hibernate.connection.<propertyName>  将JDBC属性propertyName传递到DriverManager.getConnection()中去.

hibernate.jndi.<propertyName>  将属性propertyName传递到JNDIInitialContextFactory中去.

 

Hibernate缓存属性

hibernate.cache.provider_class  自定义的CacheProvider的类名.

取值classname.of.CacheProvider

 

hibernate.cache.use_minimal_puts  以频繁的读操作为代价, 优化二级缓存来最小化写操作.在Hibernate3中,这个设置对的集群缓存非常有用, 对集群缓存的实现而言,默认是开启的.

取值 true|false

 

hibernate.cache.use_query_cache  允许查询缓存, 个别查询仍然需要被设置为可缓存的.

取值 true|false

 

hibernate.cache.use_second_level_cache  能用来完全禁止使用二级缓存.对那些在类的映射定义中指定<cache>的类,会默认开启二级缓存.

取值 true|false

 

hibernate.cache.query_cache_factory  自定义实现QueryCache接口的类名, 默认为内建的StandardQueryCache.

取值classname.of.QueryCache

 

hibernate.cache.region_prefix  二级缓存区域名的前缀.

取值 prefix

 

hibernate.cache.use_structured_entries  强制Hibernate以更人性化的格式将数据存入二级缓存.

取值 true|false

 

Hibernate事务属性

hibernate.transaction.factory_class  一个TransactionFactory的类名, 用于HibernateTransaction API (默认为JDBCTransactionFactory).

取值classname.of.TransactionFactory

 

jta.UserTransaction  一个JNDI名字,被JTATransactionFactory用来从应用服务器获取JTAUserTransaction.

取值jndi/composite/name

 

hibernate.transaction.manager_lookup_class  一个TransactionManagerLookup的类名 – 当使用JVM级缓存,或在JTA环境中使用hilo生成器的时候需要该类.

取值classname.of.TransactionManagerLookup

 

hibernate.transaction.flush_before_completion  如果开启, session在事务完成后将被自动清洗(flush)。 现在更好的方法是使用自动session上下文管理。

取值 true | false

 

hibernate.transaction.auto_close_session  如果开启, session在事务完成后将被自动关闭。 现在更好的方法是使用自动session上下文管理。

取值 true | false

 

其他属性

hibernate.current_session_context_class  为”当前” Session指定一个(自定义的)策略。

eg. jta | thread| managed | custom.Class

 

hibernate.query.factory_class  选择HQL解析器的实现.

取值org.hibernate.hql.ast.ASTQueryTranslatorFactory ororg.hibernate.hql.classic.ClassicQueryTranslatorFactory

 

hibernate.query.substitutions  将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字).

取值hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC

 

hibernate.hbm2ddl.auto  在SessionFactory创建时,自动检查数据库结构,或者将数据库schema的DDL导出到数据库. 使用 create-drop时,在显式关闭SessionFactory时,将drop掉数据库schema.

取值 validate | update| create | create-drop

 

hibernate.cglib.use_reflection_optimizer  开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 不能在hibernate.cfg.xml中设置此属性.

取值 true | false

 

PO.hbm.xml属性详解

 

1. <meta>元素的属性

 

class-description           指定描述类的javaDoc

field-description           指定描述类的属性javaDoc

interface                 如果为true,表明生成接口而非类,默认false

implements               指定类所实现的接口

extends                  指定继承的父类名

generated-class            重新指定生成的类名

scope-class               指定类的修饰符,默认public

scope-set                 指定set方法的修饰符,默认public

scope-get                 指定get方法的修饰符,默认public

scope-field                指定类的属性的修饰符,默认private

use-in-toString              如果为true,表示在toString()方法中包含此属性

gen-property                如果为false,不会在java类中生成此属性,默认true

finder-method              指定find方法名

2. <column>元素属性

name                设定字段名字

length               设定字段长度

not-null              如为true,指名该字段不允许为null,默认false

unique               如为true,指名该字段具有唯一约束,默认false

index                给一个或多个字段建立索引

unique-key           为多个字段设定唯一约束

foreign-key    为外键约束命名,在<many-to-many><one-to-one><key><many-to-one>元素中包含foreign-key属性,在双向关联中,inverse属性为true的一端不能设置foreign-key

sql-type             设定字段sql类型

check                设定sql检查约束

3. 用于控制insert or update 语句的映射属性

 

<property>元素的insert属性                  如为false,在insert中不包含该字段,默认为true

<property>元素的update属性                  如为false,在update中不包含该字段,默认为true

<class>元素的mutable属性                    如为false,等价于所有字段的update属性为false,默认为true

<property>元素的dunameic-insert属性         如为true,表明动态生成insert语句,只有不为null,才会包含insert语句中,默认false

<property>元素的dunameic-update属性         如为true,表明动态生成update语句,只有不为null,才会包含insert语句中,默认false

<class>元素的dunameic-insert属性            如为true,表明等价于所有字段动态生成insert语句,只有不为null,才会包含insert语句中                                              ,默认false

<class>元素的dunameic-update属性            如为true,表明等价于所有字段动态生成update语句,只有不为null,才会包含insert语句中                             ,默认false

 

4. Hibernate提供的内置标识符生成器

increment       适用于代理主键,自动递增,增1(只能是long,int,short)

identity        适用于代理主键,底层数据库自动增长字段类型(数据库需支持,只能是long,int,short)

(oralce)sequence    适用于代理主键,根据底层数据库的序列来生成标识符(数据库支持序列,只能是long,int,short)

hilo            适用于代理主键,根据high/low算法来生成.Hibernate把特定表的字段作为high值,在默认情况下选用hibernate_unique_key表的next_hi字段

(mysql,mssql)native适用于代理主键,根据数据库自动生成标识符支持能力,来选择identity,sequence,hilo

uuid.hex        适用于代理主键,采用128位UUID(universalunique identification)算法来生成标识.此算法能在网络环境中生成唯一的字符串标识符,

(不建议使用,字符串类型比整形类型的主键占用更多的空间)

assigned        适用于自然主键,由java程序负责生成.

 

5.

<hibernate-mapping> 
<class name="项目路径" table="库中对应表名" schema="dbo" catalog="netoa"> 
<meta attribute="class-description">指定描述类的javaDoc</meta> 
<meta attribute="class-scope">指名类的修饰类型</meta> 
<meta attribute="extends">指定继承类</meta> 
<id name="bgrkbh" type="long"> 
	<column name="BGRKBH" precision="15" scale="0" sql-type="库中类型" check="BGRKBH>10"/> 
	<meta attribute="scope-set">指定类,类属性的getxxx(),setxxx()方法的修饰符 包括:static,final,abstract,public,protected,private 
	</meta> 
<generator /> 
</id> 
<property name="Class.fileName" type="long"> 
	<column name="YSLX" precision="精度" scale="刻度" not-null="默认false" sql-type="数据库中类型"/> 
<!-- 附加属性不会影响Hibernate的运行行为 -->
	<meta attribute="field-description">指定描述类的javaDoc</meta> 
<!-- 指定描述类属性的javaDoc -->
</property> 

</class> 

</hibernate-mapping>

 

6.cascade属性

none         在保存更新时,忽略其他关联对象,这是cascade默认属性

save-update   当通过Session的save(),update()以及saveOrUpdate()方法来保存或更新当前对象时,及联保存所有关联的新建的临时对象,并且及联更新所有关联的游离对象

delete        当通过session的delete()方法删除当前对象时,及联删除所有对象

all           包含save-update及delete行为,此外对当前对象执行evict()或lock()操作时,也会对所有关联的持久化对象执行evict()或lock()操作

delete-orphan       删除所有和当前对象解除关联关系的对象

all-delete-orphan    包含all和delete-orphan

注解配置

  @Entity —— 将一个类声明为一个实体bean(即一个持久化POJO类)  

      @Id—— 注解声明了该实体bean的标识属性(对应表中的主键)。  

      @Table —— 注解声明了该实体bean映射指定的表(table),目录(catalog)和schema的名字  

      @Column—— 注解声明了属性到列的映射。该注解有如下的属性  

      name 可选,列名(默认值是属性名)  

      unique 可选,是否在该列上设置唯一约束(默认值false)  

      nullable 可选,是否设置该列的值可以为空(默认值false)  

      insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)  

      updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)  

      columnDefinition 可选,为这个特定列覆盖sqlddl片段(这可能导致无法在不同数据库间移植)  

      table 可选,定义对应的表(默认为主表)  

      length 可选,列长度(默认值255)  

      precision 可选,列十进制精度(decimalprecision)(默认值0)  

      scale 可选,如果列十进制数值范围(decimalscale)可用,在此设置(默认值0)

 @Basic  如果在成员属性没有加入任何注解,则默认在前面加入了@Basic

 @Transient 当bean中的某属性不需要参与sql操作时,用该注解屏蔽掉,用XML配置时,不配置该属性则就不会参与sql操作

 @Temporal(value=TemporalType)来注解表示日期和时间的注解

 其中TemporalType有三个值:

 TemporalType.TIMESTAMP 表示yyyy-MM-dd HH:mm:ss

 TemporalType.DATE      表示yyyy-MM-dd

 TemporalType.TIME      表示HH:mm:ss   

 

 @Enumerated(value=EnumType)来注解表示此成员属性为枚举映射到数据库

 其中EnumType有二个值:

 EnumType.STRING  表示直接将枚举名称存入数据库

 EnumType.ORDINAL表示将枚举所对应的数值存入数据库

 

  @GeneratedValue —— 注解声明了主键的生成策略。该注解有如下属性  

      strategy 指定生成的策略(JPA定义的),这是一个GenerationType。默认是GenerationType.AUTO  

      GenerationType.AUTO 根据底层数据库决定使用哪种生成策略,相当于native

      GenerationType.TABLE 使用一个特定的数据库表格来保存主键  

      GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型)此生成策略不支持Oracle 

      GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列。(这个值要与generator一起使用),此生成策略不支持MySQL  

      generator 指定生成主键使用的生成器(可能是orcale中的序列)。  

      @SequenceGenerator—— 注解声明了一个数据库序列。该注解有如下属性  

     name 表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中  

      sequenceName 表示生成策略用到的数据库序列名称。  

      initialValue 表示主键初始值,默认为0.  

      allocationSize 每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50.  

     @GenericGenerator—— 注解声明了一个hibernate的主键生成策略。支持十三种策略。该注解有如下属性  

      name 指定生成器名称  

      strategy 指定具体生成器的类名(指定生成策略)。  

      parameters 得到strategy指定的具体生成器所用到的参数。  

         其十三种策略(strategy属性的值)如下:  

         1.native 对于orcale采用Sequence方式,对于MySQL和SQL Server采用identity(处境主键生成机制),  

          native就是将主键的生成工作将由数据库完成,hibernate不管(很常用)  

          例:@GeneratedValue(generator= "paymentableGenerator")      

               @GenericGenerator(name ="paymentableGenerator", strategy = "native")   

          2.uuid 采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型)。  

            例:@GeneratedValue(generator= "paymentableGenerator")      

@GenericGenerator(name= "paymentableGenerator", strategy = "uuid")  

        3.hilo 要在数据库中建立一张额外的表,默认表名为hibernate_unque_key,默认字段为integer类型,名称是next_hi(比较少用)  

            例:@GeneratedValue(generator= "paymentableGenerator")      

               @GenericGenerator(name ="paymentableGenerator", strategy = "hilo")  

          4.assigned 在插入数据的时候主键由程序处理(很常用),这是<generator>元素没有指定时的默认生成策略。等同于JPA中的AUTO。  

            例:@GeneratedValue(generator= "paymentableGenerator")      

               @GenericGenerator(name ="paymentableGenerator", strategy = "assigned")  

           5.identity 使用SQL Server和MySQL的自增字段,这个方法不能放到Oracle中,Oracle不支持自增字段,要设定sequence(MySQL和SQL Server中很常用)。等同于JPA中的IDENTITY  

            例:@GeneratedValue(generator= "paymentableGenerator")      

               @GenericGenerator(name ="paymentableGenerator", strategy = "identity")  

           6.select 使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)  

            例:@GeneratedValue(generator= "paymentableGenerator")      

               @GenericGenerator(name ="paymentableGenerator", strategy = "select")  

           7.sequence 调用谨慎数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。  

            例:@GeneratedValue(generator= "paymentableGenerator")     

         @GenericGenerator(name ="paymentableGenerator", strategy = "sequence",      

         parameters = { @Parameter(name ="sequence", value = "seq_payablemoney") })  

           8.seqhilo通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持Sequence的数据库,如Orcale(比较少用)   

        例:@GeneratedValue(generator= "paymentableGenerator")     

         @GenericGenerator(name ="paymentableGenerator", strategy = "seqhilo",      

         parameters = { @Parameter(name ="max_lo", value = "5") })  

          9.increnment插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。  

        例:@GeneratedValue(generator= "paymentableGenerator")      

               @GenericGenerator(name ="paymentableGenerator", strategy = "increnment")  

           10.foreign 使用另一个相关的对象的主键。通常和<one-to-one>联合起来使用。  

           例:@Id       

         @GeneratedValue(generator ="idGenerator")     

         @GenericGenerator(name = "idGenerator",strategy = "foreign",      

              parameters = { @Parameter(name ="property", value = "info") })      

         Integer id;  

       

      EmployeeInfo info;  

          11.guid采用数据库底层的guid算法机制,对应MySQL的uuid()函数,SQL Server的newid()函数,ORCALE的rawtohex(sys_guid())函数等  

        例:@GeneratedValue(generator= "paymentableGenerator")       

         @GenericGenerator(name ="paymentableGenerator", strategy = "guid")   

         12.uuid.hex看uudi,建议用uuid替换  

         例:@GeneratedValue(generator= "paymentableGenerator")       

         @GenericGenerator(name ="paymentableGenerator", strategy = "uuid.hex")  

        13.sequence-identity sequence策略的扩展,采用立即检索策略来获取sequence值,需要JDBC3.0和JDK4以上(含1.4)版本  

            例:@GeneratedValue(generator= "paymentableGenerator")     

         @GenericGenerator(name ="paymentableGenerator", strategy ="sequence-identity",      

              parameters = { @Parameter(name ="sequence", value = "seq_payablemoney") })   

     

       

     @OneToOne设置一对一个关联。cascade属性有五个值,分别是CascadeType.PERSIST(级联新建),CascadeType.REMOVE(级联删除),CascadeType.REFRESH(级联刷新),CascadeType.MERGE(级联更新),CascadeType.ALL(全部四项)  

         方法一  

         主表:?@OneToOne(cascade = CascadeType.ALL)  

           @PrimaryKeyJoinColumn 

           public 从表类 get从表类(){return 从表对象}  

           从表:没有主表类。  

           注意:这种方法要求主表与从表的主键值相对应。  

        方法二  

          主表:?@OneToOne(cascade= CascadeType.ALL)  

               @JoinColumn(name="主表外键")//这里指定的是数据库中的外键字段。  

               public 从表类 get从表类(){return 从表类}  

           从表:@OneToOne(mappedBy= "主表类中的从表属性")//例主表User中有一个从表属性是Heart类型的heart,这里就填heart  

               public 主表类 get主表类(){return 主表对象}  

           注意:@JoinColumn是可选的。默认值是从表变量名+"_"+从表的主键(注意,这里加的是主键。而不是主键对应的变量)。  

               方法三  

           主表:@OneToOne(cascade=CascadeType.ALL)  

               @JoinTable(name="关联表名",  

          joinColumns = @JoinColumn(name="主表外键"),  

          inverseJoinColumns =@JoinColumns(name="从表外键")  

               )  

           从表:@OneToOne(mappedBy= "主表类中的从表属性")//例主表User中有一个从表属性是Heart类型的heart,这里就填heart  

               public 主表类 get主表类(){return 主表对象}      

      @ManyToOne设置多对一关联  

         方法一         

         @ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE})  

         @JoinColumn(name="外键")  

         public 主表类 get主表类(){return 主表对象}  

        方法二  

         @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})  

         @JoinTable(name="关联表名",  

         joinColumns = @JoinColumn(name="主表外键"),  

         inverseJoinColumns =@JoinColumns(name="从表外键")  

         )  

     @OneToMany设置一对多关联。cascade属性指定关联级别,参考@OneToOne中的说明。fetch指定是否延迟加载,值为FetchType.LAZY表示延迟,为FetchType.EAGER表示立即加载  

         方法一     使用这种配置,在为“一端”添加“多端”时,不会修改“多端”的外键。在“一端”加载时,不会得到“多端”。如果使用延迟加载,在读“多端”列表时会出异常,立即加载在得到多端时,是一个空集合(集合元素为0)。  

         “一端”配置  

         @OneToMany(mappedBy="“多端”的属性")  

         public List<“多端”类> get“多端”列表(){return“多端”列表}  

         “多端”配置参考@ManyToOne.       

         方法二  

         “一端”配置  

         @OneToMany(mappedBy="“多端”的属性")  

         @MapKey(name="“多端”做为Key的属性")  

         public Map<“多端”做为Key的属性的类,主表类> get“多端”列表(){return“多端”列表}  例:

privateMap<Integer,User> users = new HashMap<Integer, User>();

@OneToMany(mappedBy="group",cascade=CascadeType.ALL)

@MapKey(name="id")    //注解使用哪个字段为key

publicMap<Integer,User> getUsers() { return users;}

         “多端”配置参考@ManyToOne.   

         方法三 使用这种配置,在为“一端”添加“多端”时,可以修改“多端”的外键。  

         “一端”配置  

         @OneToMany 

         @JoinColumn(name="“多端”外键")   

         public List<“多端”类> get“多端”列表(){return“多端”列表}  

         “多端”配置参考@ManyToOne.  


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。