可持久化对象有以下三种状态:
临时状态(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.