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(全部四项)

方法一

主表:[email protected](cascade = CascadeType.ALL)

@PrimaryKeyJoinColumn

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

从表:没有主表类。

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

方法二

主表:[email protected](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 [email protected](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 [email protected](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.

时间: 2024-08-05 19:35:36

Hibernate之配置文件的相关文章

spring(一)--spring/springmvc/spring+hibernate(mybatis)配置文件

这篇文章用来总结一下spring,springmvc,spring+mybatis,spring+hibernate的配置文件 1.web.xml 要使用spring,必须在web.xml中定义分发器等信息,基本的配置信息如下: <?xml version="1.0" encoding= "UTF-8"?> <web-app version= "3.0" xmlns="http://java.sun.com/xml/n

2.一起来学hibernate之配置文件1与持久化对象

学框架,配置都是不可少的,有了配置,框架才知道我们想做什么,才知道如何去执行我们需要的操作! hibernate的配置文件,总体来说分为两个部分: 1.主配置文件hibernate.cfg.xml文件,一般放在classpatn路径下 2.映射文件xxx.hbm.xml文件,一般跟实体类放在同一个包下 前者是配置相关的数据库以及引入的映射文件信息,而后者则主要配置对象与表之间的映射关系: 注意:配置文件的路径,因人而异,有的将映射文件集体放置在一起也有,所以看个人喜好,没有强制规定如何存放. 以

Hibernate学习笔记(一) — hibernate的配置文件简介与执行原理

一.初识Hibernate 1.JDBC的缺点: 1).编写代码的时候过于繁琐,try和catch比较多2).没有做数据缓存 3).不是面向对象编程 4).sql语句固定,可移植性差 JDBC的优点:效率比较高 2.Hibernate优点 1).完全面向对象编程 2).hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存3).跨平台性强 4).使用场合多应用于企业内部的系统 Hibernate缺点 1).效率低 2).表中的数据如果在千万级别,则hibernate不适合 3).如果表与表

Hibernate之配置文件以及对象关系映射文件了解

声明:CSDN不知道怎么了,有时候就是发表不了博文.本来就是一天一篇博文,最近搞的我很郁闷.有时候一天,有时候两三天都不能发.这就属于不可抗力.没办法的,啥时能发,我就发了. 一.学习案例:关于hibernate的配置文件以及对象关系映射文件的了解. 二.案例分析: a)hibernate配置文件(hibernate.cfg.xml) 1.hibernate.dialect:数据库使用的SQL方言 2.hiebrnate.connection.driver_class:数据库的驱动程序 3.hi

Hibernate常用配置文件详解

本文转载自:http://blog.csdn.net/csh624366188/article/details/7578939 初学hibernate的童鞋,刚开应该都有这种感觉,hibernate的配置文件好麻烦,还不如jdbc访问数据库呢,直接写代码,多方便,用hibernate还要写代码,还要写配置,太麻烦了.至少我刚开始学习的时候就是这么想的.配置文件确实有他枯燥的一面,但等你真正深入学习的时候,你就可以发现他枯燥的背后却藏着很多强大的功能,呵呵,让我说的这么玄乎,那就让我们一起来看看吧

eclipse 新建 maven 项目 添加 spring hibernate 的配置文件 详情

主要配置文件 pom.xml 项目的maven 配置文件 管理项目所需 jar 依赖支持 web.xml 项目的总 配置文件  :添加 spring和hibernate 支持 applicationContext.xml   hibernate的配置文件 sping-servlet.xml spring的配置文件 jdbc-properties 数据库连接属性 文件 ------------------------------pom.xml 开始-------------------------

(转)Hibernate框架基础——Hibernate API及Hibernate主配置文件

Hibernate的学习路线图 Hibernate API简介 Configuration Configuration类负责管理Hibernate的配置信息,包括如下内容: Hibernate运行的底层信息:数据库的URL.用户名.密码.JDBC驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件). 持久化类与数据表的映射关系(*.hbm.xml文件). 创建Configuration的两种方式: 属性文件(hibernate.properties) Con

Hibernate之深入Hibernate的配置文件

1.创建Configuration类的对象 Configuration类的对象代表了应用程序到SQL数据库的映射配置.Configuration类的实例对象,提供一个buildSessionFactory()方法,该方法可以产生一个唯一的 SessionFactory类的对象. 根据使用的配置文件不同,得到这个代表了应用程序到SQL数据库的映射配置的Configuration类的对象方法也不同: (1)使用hibernate.cfg.xml配置文件 Configuration  cfg   = 

3.一起来学hibernate之配置文件2

之前的映射文件配置都是简单的.基础的配置,只涉及到单个javabean,对于单个javabean的增删改查都能很好的.简单的去完成. 但是知道简单配置远远不够,并不能完成很多复杂的情况,比如对象与对象间的关联,对象中的集合属性等,所以还需更近一步的学习hibernate映射文件的配置. 本次映射文件配置涉及到集合.排序.多对一.一对多.多对多.以及一对一的内容等. 1.集合属性(Set.List.Map.数组) 1.1Set集合: 首先,创建一个User实体类,实体类是一个买家账号,包含id.n