hibernate学习(二) 体系结构(Architecture)

1.hibernate 持久化服务(数据库,配置信息)
(其他jta,jdbc,jndi,sessionFactory,session)

2.最小集(应用自己提供jdbc连接,事务)

3.全面体系解决(hibernate 接管sessionFactory(transactionFactory,connectionProvider),session,Transaction)
封装了jta,jdbc,jndi等

4.定义
sessionFactory
a)单个数据库关系经过编译后内存镜像,线程安全,不变,
b)可在进程或集群级,为事务间可共用数据提供二级缓存

session (持久化上下文)
a)应用与持久化层交互的单线程对象,隐藏jdbc连接,是transaction工厂
b)持有持久化对象必选缓存(第一级)


持久的对象
带有持久化状态,单线程对象(与session关联),session关闭变托管
持久化标识与java标识等价

瞬态(transient),脱管(detached)
创建的,还未持久化(无主键),
持久化后,session关闭的,或实例被序列化到另外进程

transaction session可包含多个事务

5 JMX 整合
jboss as提供:
会话管理:session自动跟jta事务边界绑定,无需手动开关
har部署:

6.上下文会话(contextual session)
界定范围(scope) 上下文(context)
hibernate.current_session_context_class(thread,jta,managed)
org.hibernate.context.CurrentSessionContext
a)JTASessionContext
b)ThreadLocalSessionContext(当前执行的线程来跟踪)
c)ManagedSessionContext(当前执行的线程来跟踪界定,手动Session绑定,open.close)

a|b 是one session one transaction

7.
a)org.hibernate.cfg.Configuration java->sql映射的完整集合,用来构造sessionFactory
Configuration cfg = new Configuration()
    .addResource("Item.hbm.xml")
    .addResource("Bid.hbm.xml");//在类路径 addResource

Configuration cfg = new Configuration()
    .addClass(org.hibernate.auction.Item.class)
    .addClass(org.hibernate.auction.Bid.class);//指定类名

Configuration cfg = new Configuration()
    .addClass(org.hibernate.auction.Item.class)
    .addClass(org.hibernate.auction.Bid.class)
    .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect")
    .setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test")
    .setProperty("hibernate.order_updates", "true");//设置属性

Configure是启动时(start-time)对象,在sessionFactory创建后丢弃
b)SessionFactory sessions = cfg.buildSessionFactory();//应用所有线程共享
c)sessionFactory创建和缓存jdbc连接(池) 获取连接
Session session = sessions.openSession();

d)使用c3p0连接池(另Proxool)
hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost/mydatabase
hibernate.connection.username = myuser
hibernate.connection.password = secret
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

e)应用服务器获取hibernate ,hibernate配置从jndi中dataSource获取连接
hibernate.connection.datasource = java:/comp/env/jdbc/test
hibernate.transaction.factory_class = \
    org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_lookup_class = \
    org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

1)从jndi获取的连接自动参与到容器管理事务
2)连接属性名以hibernate.connection开头(.charSet)


8.外连接抓取(抓取关联数据outer join) hibernate.max_fetch_depth 单向关联(one2one,many2one )outer join fetch
hibernate.order_updates 按更新数据主键,为sql更新排序(减少并发死锁)

9.dialect 方言为属性指定合理默认值

10.oracle 限制通过jdbc传输字节数组数目(二进制流)
hibernate.jdbc.use_streams_for_binary 开启使用二进制或可序列化的大对象

11.使用log4j日志
slf4j-api.jar
slf4j-log4j12.jar
log4j.properties

12 实现 NamingStrategy
SessionFactory sf = new Configuration()
    .setNamingStrategy(ImprovedNamingStrategy.INSTANCE)//TBL_ 前缀
    .addFile("Item.hbm.xml")
    .addFile("Bid.hbm.xml")
    .buildSessionFactory();

13.使用hibernate.cfg.xml
SessionFactory sf = new Configuration().configure().buildSessionFactory();

14.hibernate对j2ee应用服务器集成
a)容器管理数据源:
b)jndi绑定
c)jta session绑定
d)jmx部署

15.事务策略(hibernate transaction api)
a)hibernate的session api独立于任何事务边界系统
b)配置hibernate.transaction.factory_class

org.hibernate.transaction.JDBCTransactionFactory
默认:委托数据库jdbc事务
org.hibernate.transaction.JTATransactionFactory
若上下文环境存在运行的事务,委托给容器;否则,启动新事务,使用Bean管理的事务
org.hibernate.transaction.CMTTransactionFactory
委托给容器管理的JTA事务

c)指定TransactionManager
org.hibernate.transaction.WeblogicTransactionManagerLookup
...

16.sessionFactory绑定到JNDI
a)hibernate.session_factory_name=java:hibernate/SessionFactory(名字自己指定)
b)绑定后,使用hibernate.jndi.url hibernate.jndi.class实例化initial context
(未指定,使用默认initial context)
c)cfg.buildSessionFactory(),sessionFactory被自动绑定到jndi
d)建议(在受管理环境绑定),非受管理 static singleton

17.pojo
a)标识符 建议包装类(可以为空)
b)非final类,或所有方法public的接口(可代理),有public final 方法,不能代理/延迟加载lazy="false"
c)hibernate可对任意修饰符进行持久化
d)equals() hashCode() 当放入set,用equals比较是否唯一值
未持久化对象没有标识符,建议用业务键值相等实现
1)比较是否本身
2)是否相同类
3)比较业务值

18.动态模型(dynamic models)
运行期使用map或dom4j(树模型),只需映射文件,不用持久化类
<hibernate-mapping>
    <class entity-name="Customer">
a)不能在编译期检查

19.元组片段映射(Tuplizers)

20.EntityNameResovlers 解析实例的实体名称

21.entityResolver
a)先找classpath解析dtd(依靠org.xml.sax.EntityResolver)
sax依靠它读取xml
1)classpath:// URL 为用户命名空间,resolver通过当前线程上下文classloader||加载hibernate class的classpath解析
2)http://hibernate.sourceforge.net/ 为hibernate namespace 则试图通过加载hibernate类的classloader来查找实体

22.hibernate-mapping
<hibernate-mapping
         schema="schemaName"
         catalog="catalogName"
         default-cascade="cascade_style"
         default-access="field|property|ClassName"
         default-lazy="true|false"
         auto-import="true|false"---可使用非全限定的类名
         package="package.name"
/>

23.类(未指定不同,默认为一样) 5.1.3
a)持久化类可以是接口,<subclass>指定实现类,可持久化static内部类(类名Foo$Bar)
b)proxy延迟加载.hibernate会返回这个命名接口的cglib代理,当代理方法被调用,真正的持久化类才加载
c)polymorphism="implicit" 查询包含超类,接口,类名都可返回
d)presister 可定制持久化策略
e)视图不可变,映射方法 不可变的(immutable)
<class name="Summary">
    <subselect>
        select item.name, max(bid.amount), count(*)
        from item
        join bid on bid.item_id = item.id
        group by item.name
    </subselect>
    <synchronize table="item"/>
    <synchronize table="bid"/>
    <id name="name"/>
f)generator (sequence,identity,hilo,native,assigned(默认)
foreign(通常和one-to-one一起)

g)增强的标识符生成器
SequenceStyleGenerator(3.2.3+)比native有更好的移植性
TableGenarator
h)标识符优化(加载到内存)
1)none2)hilo3)pooled

h)
<composite-id         name="propertyName"         class="ClassName"         mapped="true|false"         access="field|property|ClassName">         node="element-name|."        
<key-property name="propertyName" type="typename" column="column_name"/>         <key-many-to-one name="propertyName class="ClassName" column="column_name"/>      
</composite-id >

<composite-id>        
<key-property name="medicareNumber"/>       
<key-property name="dependent"/>
</composite-id >
--嵌入式的组合标识符,手动填充
持久化类要实现equals() hashCode() 实现serialiable接口

<composite-id class="MedicareId" mapped="true">        
<key-property name="medicareNumber"/>        
<key-property name="dependent"/> </composite-id >


i)鉴别器
<discriminator column="discriminator_column" type="discriminator_type" force="true|false" insert="true|false" formula="arbitrary sql expression" />
j)版本 在长事务有用
k)property 默认lazy="false"

typename 可以是如下几种:

1.Hibernate 基本类型名(比如:integer, string, character,date, timestamp, float, binary, serializable, object, blob)。
2.一个 Java 类的名字,这个类属于一种默认基础类型(比如:int, float,char, java.lang.String, java.util.Date, java.lang.Integer, java.sql.Clob)。
3.一个可以序列化的 Java 类的名字。
4.一个自定义类型的类的名字。(比如:com.illflow.type.MyCustomType)。

衍生属性(derive propertie)
<property name="totalPrice"     formula="( SELECT SUM (li.quantity*p.price) FROM LineItem li, Product p                 WHERE li.productId = p.productId                 AND li.customerId = customerId                 AND li.orderNumber = orderNumber )"/>

l)many-to-one 外键对应另一个表的主键

m)one-to-one (赋予相同标识符--两个主键一对一关联)
<class name="person" table="PERSON">    
<id name="id" column="PERSON_ID">        
<generator class="foreign">             <param name="property" >employee</param>         </generator>     </id>     ...     <one-to-one name="employee"         class="Employee"         constrained="true"/> </class >

另一种方式(外键和唯一关键字对应)
<many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>
添加双向关联
<one-to-one name="employee" class="Employee" property-ref="person"/>

n)自然 ID(natural-id) 唯一且非空

5.1.15

你可能感兴趣的:(数据结构,Hibernate,jdbc)