`
Cages
  • 浏览: 103619 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate 关系映射 收集、总结整理

 
阅读更多

《Hibernate 关系映射》是我很早之前收集、总结整理的,在此也发上来 希望对大家有用。因为是很早之前写的,不当之处请指正。

一、概念:

关系:名词,事物之间相互作用、相互联系的状态。

关联:名词:表示对象(数据库表)之间的关系;动词:将对象(数据库表)之间通过某种方式联系起来。

映射:将一种形式转化为另一种形式,包括关系。

级联:动词,有关系的双方中操作一方,另一方也将采取一些动作。

值类型:对象不具备数据库同一性,属于一个实体实例其持久化状态被嵌入到所拥有的实体的表行中,没有标识符。

实体类型:具有数据库标识符。

二、数据库:

1、关系

2.1.1、一对一、一对多、多对多

2.1.2、如何表示?外键+索引

2、级联

2.2.1、级联删除

三、面向对象语言中(Java中):

1、关系

3.1.1、一对一、一对多、多对多

3.1.2、如何表示?实例变量(对象+集合)

2、级联:

3.2.1、级联删除

3.2.2、级联更新

3.2.3、级联保存

四、如何把数据库关系表示为面向对象中的关系:

1、关联:将数据库表之间的关系转化为对象之间的关系;在Hibernate中总指实体之间的关系。

2、映射:完成java对象到数据库表的双向转换。

3、级联(可选):将数据库中的级联转化为对象中的级联(两者(对象和数据库表)没关系)。

4、Hibernate的表和对象的映射:

1、实体类型映射:

4.1.1、主键之间的映射

4.1.2、类属性与表字段的映射

4.1.3、组件映射

4.1.4、集合映射

2、实体关联关系映射:

4.2.1、关联关系映射

五、Hibernate映射示例:

5.1、实现

5.1.1、数据库表定义(主表)

5.1.1.1、用户表

Java代码收藏代码
  1. CREATETABLETBL_USER(
  2. UUIDNUMBER(10)NOTNULL,
  3. NAMEVARCHAR2(100),
  4. AGENUMBER(10)NOTNULL,
  5. PROVINCEVARCHAR2(100),
  6. CITYVARCHAR2(100),
  7. STREETVARCHAR2(100),
  8. CONSTRAINTPK_USERPRIMARYKEY(UUID));

5.1.1.2、用户普通信息表(一个用户有一个资料)

Java代码收藏代码
  1. CREATETABLETBL_USER_GENERAL(
  2. UUIDNUMBER(10)NOTNULL,
  3. REALNAMEVARCHAR2(10),
  4. GENDERVARCHAR2(10),
  5. BIRTHDAYNUMBER(10),
  6. HEIGHTNUMBER(10),
  7. WEIGHTNUMBER(10),
  8. CONSTRAINTPK_USER_GENERALPRIMARYKEY(UUID),
  9. CONSTRAINTFK_USER_GENERALFOREIGNKEY(UUID)
  10. REFERENCESTBL_USER(UUID));

5.1.1.3、农场表(一个用户有多个农场)

Java代码收藏代码
  1. CREATETABLETBL_FARM(
  2. UUIDNUMBER(10)NOTNULL,
  3. NAMEVARCHAR2(10),
  4. FK_USER_IDNUMBER(10),
  5. CONSTRAINTPK_FARMPRIMARYKEY(UUID),
  6. CONSTRAINTFK_USER_FARMFOREIGNKEY(FK_USER_ID)
  7. REFERENCESTBL_USER(UUID));

5.1.2、对象定义

5.1.2.1、用户地址Model

Java代码收藏代码
  1. packagecn.javass.h3test.model;
  2. publicclassAddressModelimplementsjava.io.Serializable{
  3. privateStringprovince;//省
  4. privateStringcity;//市
  5. privateStringstreet;//街道
  6. }

5.1.2.2、用户Model

Java代码收藏代码
  1. packagecn.javass.h3test.model;
  2. importjava.util.HashSet;
  3. importjava.util.Set;
  4. publicclassUserModelimplementsjava.io.Serializable{
  5. privateintuuid;
  6. privateStringname;//名称
  7. privateintage;//年龄
  8. privateAddressModeladdress;//地址
  9. privateUserGeneralModeluserGeneral;//用户普通信息
  10. privateSet<FarmModel>farms=newHashSet<FarmModel>();//拥有的农场
  11. }

5.1.2.3、用户普通信息Model

Java代码收藏代码
  1. packagecn.javass.h3test.model;
  2. publicclassUserGeneralModelimplementsjava.io.Serializable{
  3. privateintuuid;
  4. privateStringrealname;//真实姓名
  5. privateStringgender;//性别
  6. privateStringbirthday;//生日
  7. privateintweight;//体重
  8. privateintheight;//身高
  9. privateUserModeluser;//所属用户
  10. }

5.1.2.4、农场Model

Java代码收藏代码
  1. packagecn.javass.h3test.model;
  2. publicclassFarmModelimplementsjava.io.Serializable{
  3. privateintuuid;
  4. privateStringname;//农场的名称
  5. privateUserModeluser;//所属用户
  6. }

5.2、配置

5.2.1、实体类型映射:

5.2.1.1、主键的映射(UserModel.hbm.xml)

Java代码收藏代码
  1. <idname="uuid">
  2. <generatorclass="sequence">
  3. <paramname="sequence">user_uuid</param>
  4. </generator>
  5. </id>

5.2.1.2、类属性与表字段的映射(UserModel.hbm.xml)

Java代码收藏代码
  1. <propertyname="name"/>

5.2.1.3、组件映射(UserModel.hbm.xml)

Java代码收藏代码
  1. <componentname="address"class="cn.javass.h3test.model.AddressModel">
  2. <propertyname="province"/>
  3. <propertyname="city"/>
  4. <propertyname="street"/>
  5. </component>

5.2.1.4、集合映射(Set、List、Map)(都是通过外键连接的,,,默认延迟抓取)

Set:

Java代码收藏代码
  1. privateSet<String>farmSet=newHashSet<String>();

Java代码收藏代码
  1. <setname="farmSet"table="TBL_FARM">
  2. <keycolumn="fk_user_id"/><!—该外键是tbl_farm的-->
  3. <elementtype="string"column="name"/>
  4. </set>

Java代码收藏代码
  1. privateList<String>farmList=newArrayList<String>();

Java代码收藏代码
  1. <listname="farmList"table="TBL_FARM">
  2. <keycolumn="fk_user_id"/>
  3. <list-indexcolumn="uuid"></list-index>
  4. <elementtype="string"column="name"/>
  5. </list>

Java代码收藏代码
  1. privateMap<Integer,String>farmMap=newHashMap<Integer,String>();
Java代码收藏代码
  1. <mapname="farmMap"table="TBL_FARM">
  2. <keycolumn="fk_user_id"/>
  3. <map-keytype="int"column="uuid"/>
  4. <elementtype="string"column="name"></element>
  5. </map>

对于集合类型默认是延迟加载的,且只能单向导航,不能双向。

5.2.2、实体关联关系映射:

5.2.2.1、单向关联关系映射,不演示。

5.2.2.2、双向关联关系映射

Java代码收藏代码
  1. 单向
  2. 定义:不知道另一端什么情况,获取一端另一端自动获取,因为单向,你不知道另一侧是什么。
  3. classA{Bb;}
  4. classB{}
  5. 只能从A导航到B,不能从B导航到A
  6. 关系维护:另一端维护,如B维护
  7. 双向
  8. 定义:知道另一端(两个单向),从一端获取另一端,从另一端也能获取一端
  9. classA{Bb;}
  10. classB{Aa;}
  11. 只能从A导航到B,也能从B导航到A
  12. 关系维护:两端,对关联的一侧所作的改变,会立即影响到另一侧
  13. 关联的多样性:
  14. 从一侧看是多对一,从另一侧看是一对多
  15. 另外还有一对一、多对多
  16. EJBCMP:天生双向,对关联的一侧所作的改变,会立即影响到另一侧,
  17. 如userGeneral.set(user),则自动调用user.setUserGeneral(userGeneral)
  18. Hibernate、JPA:天生单向,两侧关系的维护是不同的关联,必须手工维护
  19. 如userGeneral.set(user),则需要手工调用user.setUserGeneral(userGeneral)。

5.2.2.3、一对一主键关系映射(非延迟抓取)

配置1(UserModel.hbm.xml)

Java代码收藏代码
  1. <one-to-onename="userGeneral"cascade="all"/>

配置2(UserGeneralModel.hbm.xml)

Java代码收藏代码
  1. <idname="uuid">
  2. <generatorclass="foreign">
  3. <paramname="property">user</param>
  4. </generator>
  5. </id>
  6. <one-to-onename="user"
  7. class="cn.javass.h3test.model.UserModel"/>

关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。

测试:保存对象,只需保存user,自动级联保存用户信息Model

Java代码收藏代码
  1. UserModeluser=newUserModel();
  2. user.setName("昵称");
  3. UserGeneralModeluserGeneral=newUserGeneralModel();
  4. userGeneral.setRealname("真实姓名");
  5. userGeneral.setUser(user);
  6. user.setUserGeneral(userGeneral);
  7. session.save(user);
  8. //若没有cascade="all",这句必须
  9. //session.save(userGeneral);

1、一对一必须手工维护双向关系。

2、cascade="all":表示保存user时自动保存userGeneral,否则还需要一条save(userGeneral)

3、constrained:添加把userGeneral表的主键映射到user主键的外键约束

5.2.2.4、一对多关系映射(父/子关系映射)

配置1(UserModel.hbm.xml)

Java代码收藏代码
  1. <setname="farms"cascade="all">
  2. <keycolumn="fk_user_id"/>
  3. <one-to-manyclass="cn.javass.h3test.model.FarmModel"/>
  4. </set>

配置2(FarmModel.hbm.xml)

Java代码收藏代码
  1. <many-to-onename="user"column="fk_user_id"
  2. class="cn.javass.h3test.model.UserModel">

测试:保存对象,只需保存user,自动级联保存用户信息Model

Java代码收藏代码
  1. UserModeluser=newUserModel();
  2. user.setName("昵称");
  3. UserGeneralModeluserGeneral=newUserGeneralModel();
  4. userGeneral.setRealname("真实姓名");
  5. userGeneral.setUser(user);
  6. user.setUserGeneral(userGeneral);
  7. FarmModelfarm=newFarmModel();
  8. farm.setName("farm1");
  9. farm.setUser(user);
  10. user.getFarms().add(farm);
  11. //session.save(farm);//若没有cascade=all的话需要这条语句
  12. session.save(user);

以上配置有问题:

Java代码收藏代码
  1. insertintoTBL_USER(name,age,province,city,street,uuid)values(?,?,?,?,?,?)
  2. insertintoTBL_USER_GENERAL(realname,gender,birthday,weight,height,uuid)values(?,?,?,?,?,?)
  3. insertintoTBL_FARM(name,fk_user_id,uuid)values(?,?,?)
  4. updateTBL_FARMsetfk_user_id=?whereuuid=?

1、持久化user(UserModel)

2、持久化user的一对一关系,即userGeneral(UserGeneralModel);

3、持久化user的一对多关系,即farms(Set<FarmModel>)

3.1、首先发现farm是TO,级联save;(因为在这可能是PO,PO的话就应该update,而不是save);

3.2、其次发现farm在farms集合中,因此需要更新外键(fk_user_id),即执行“update TBL_FARM set fk_user_id=? where uuid=?“。

解决这个问题:

告诉Hibernate应该只有一端来维护关系(外键),另一端不维护;通过指定<set>端的inverse=”true”,表示关系应该由farm端维护。即更新外键(fk_user_id)将由farm端维护。

配置修改(UserModel.hbm.xml)

Java代码收藏代码
  1. <setname="farms"cascade="all"inverse="true">
  2. <keycolumn="fk_user_id"/>
  3. <one-to-manyclass="cn.javass.h3test.model.FarmModel"/>
  4. </set>

再测试:保存对象,只需保存user,自动级联保存用户信息Model

Java代码收藏代码
  1. UserModeluser=newUserModel();
  2. user.setName("昵称");
  3. UserGeneralModeluserGeneral=newUserGeneralModel();
  4. userGeneral.setRealname("真实姓名");
  5. userGeneral.setUser(user);
  6. user.setUserGeneral(userGeneral);
  7. FarmModelfarm=newFarmModel();
  8. farm.setName("farm1");
  9. farm.setUser(user);
  10. user.getFarms().add(farm);
  11. //session.save(farm);//若没有cascade=all的话需要这条语句
  12. session.save(user);

更新外键,需要修改FarmModel的外键并update:

Java代码收藏代码
  1. insertintoTBL_USER(name,age,province,city,street,uuid)values(?,?,?,?,?,?)
  2. insertintoTBL_USER_GENERAL(realname,gender,birthday,weight,height,uuid)values(?,?,?,?,?,?)
  3. insertintoTBL_FARM(name,fk_user_id,uuid)values(?,?,?)

级联删除

1、当删除user时自动删除user下的farm

Java代码收藏代码
  1. user=(UserModel)session.get(UserModel.class,1);
  2. session.delete(user);

结果:

Java代码收藏代码
  1. Hibernate:deletefromTBL_USER_GENERALwhereuuid=?
  2. Hibernate:deletefromTBL_FARMwhereuuid=?
  3. Hibernate:deletefromTBL_USERwhereuuid=?

2、删除user中的farms的一个元素

Java代码收藏代码
  1. UserModeluser=
  2. (UserModel)session.get(UserModel.class,118);
  3. FarmModelfarm=(FarmModel)user.getFarms().toArray()[user.getFarms().size()-1];
  4. user.getFarms().remove(farm);//1.必须先从集合删除
  5. session.delete(farm);//2.然后才能删除

结果:

Java代码收藏代码
  1. Hibernate:deletefromTBL_FARMwhereuuid=?

如果将子对象从集合中移除,实际上我们是想删除它。要实现这种要求,就必须使用cascade="all-delete-orphan"。无需再调用session.delete(farm)

5.2.2.5、多对多关系映射:不用

为什么不使用多对多:当添加新字段时给谁?

那实际项目如何用:拆成两个一对多。

六、涉及的SQL语句会按照下面的顺序发出执行:

1、查询

1、所有对实体进行插入的语句,其顺序按照对象执行Session.save()的时间顺序

2、所有对实体进行更新的语句

3、所有进行集合插入的语句(实体类型)

4、所有对集合元素进行删除、更新或插入的语句(值类型)

5、所有进行集合删除的语句(实体类型)

6、所有对实体进行删除的语句,其顺序按照对象执行Session.delete()的时间顺序

(有一个例外是,如果对象使用native方式来生成ID(持久化标识)的话,它们一执行save就会被插入。)

七、影响关系映射抓取的cfg配置:

hibernate.max_fetch_depth

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

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

hibernate.default_batch_fetch_size

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

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

如果你的数据库支持ANSI, Oracle或Sybase风格的外连接,外连接抓取通常能通过限制往返数据库次数 (更多的工作交由数据库自己来完成)来提高效率. 外连接抓取允许在单个SELECTSQL语句中, 通过many-to-one, one-to-many, many-to-many和one-to-one关联获取连接对象的整个对象图.

将hibernate.max_fetch_depth设为0能在全局范围内禁止外连接抓取. 设为1或更高值能启用one-to-one和many-to-one外连接关联的外连接抓取, 它们通过 fetch="join"来映射.

八、抓取策略

1、抓取策略定义

抓取策略(fetching strategy)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略。抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL 或条件查询(CriteriaQuery)中重载声明。

2、Hibernate3定义了如下几种抓取策略:

连接抓取(Join fetching)- Hibernate通过 在SELECT语句使用OUTER JOIN(外连接)来 获得对象的关联实例或者关联集合。 默认非延迟加载
集合抓取需要通过配置fetch="join"来指定。下行数据太多(冗余),IO

Java代码收藏代码
  1. //配置fetch="join"(lazy="true"不起作用了)
  2. session.get(UserModel.class,118);//是获取对象的
  3. Hibernate:select…fromTBL_USERusermodel0_,TBL_FARMfarms1_
  4. whereusermodel0_.uuid=farms1_.fk_user_id(+)andusermodel0_.uuid=?

查询抓取(Select fetching)-另外发送一条SELECT语句抓取当前对象的关联实体或集合。除非你显式的指定lazy="false"禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。

Java代码收藏代码
  1. ////配置lazy=”true”默认(或者lazy="false"fetch="select")
  2. session.get(UserModel.class,118);//是获取对象的
  3. Hibernate:select…fromTBL_USERusermodel0_whereusermodel0_.uuid=?
  4. Hibernate:select…fromTBL_FARMfarms0_wherefarms0_.fk_user_id=?

默认用于lazy="true"情况的集合抓取,如果lazy="false"需要指定fetch="select"来通过查询抓取。会造成DB的CPU利用率非常高,计算密集

子查询抓取(Subselect fetching)-另外发送一条SELECT语句抓取在前面查询到(或者抓取到)的所有实体对象的关联集合。除非你显式的指定lazy="false"禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。
当通过Query等接口查询多个实体时,如果指定fetch="subselect"则将通过子查询获取集合

Java代码收藏代码
  1. ////配置fetch="subselect"
  2. Queryq=session.createQuery("fromUserModel");
  3. System.out.println(q.list());
  4. Hibernate:select……fromTBL_USERusermodel0_
  5. Hibernate:select……fromTBL_FARMfarms0_wherefarms0_.fk_user_id
  6. in(selectusermodel0_.uuidfromTBL_USERusermodel0_)

批量抓取(Batch fetching)- 对查询抓取的优化方案, 通过指定一个主键或外键列表,Hibernate使用单条SELECT语句获取一批对象实例或集合。

当通过Query等接口查询多个实体时,如果指定farm的batch-size="……"则将通过使用单条SELECT语句获取一批对象实例或集合

Java代码收藏代码
  1. Queryq=session.createQuery("fromUserModel");
  2. List<UserModel>userList=q.list();System.out.println(userList);
  3. Hibernate:select…TBL_USERusermodel0_
  4. Hibernate:select…fromTBL_FARMfarms0_wherefarms0_.fk_user_idin(?,?)

可指定全局批量抓取策略:hibernate.default_batch_fetch_size,取值:建议的取值为4, 8,和16。

如果batch-size="4",而某个user有19个农场,Hibernate将只需要执行五次查询,分别为4、4、4、4、3。

测试必须数据量足够多,,如果只有一条不行

3、使用延迟属性抓取(Using lazy property fetching)

属性的延迟载入要求在其代码构建时加入二进制指示指令(bytecode instrumentation),如果你的持久类代码中未含有这些指令,Hibernate将会忽略这些属性的延迟设置,仍然将其直接载入。

Hibernate3对单独的属性支持延迟抓取,这项优化技术也被称为组抓取(fetch groups)。 请注意,该技术更多的属于市场特性。在实际应用中,优化行读取比优化列读取更重要。但是,仅载入类的部分属性在某些特定情况下会有用,例如在原有表中拥有几百列数据、数据模型无法改动的情况下。

4、Hibernate在抓取时会lazy区分下列各种情况:

立即抓取-当宿主被加载时,关联、集合或属性被立即抓取。

Lazy collection fetching,延迟集合抓取-直到应用程序对集合进行了一次操作时,集合才被抓取。(对集合而言这是默认行为。)

Extra-lazy" collection fetching,"Extra-lazy"集合抓取-对集合类中的每个元素而言,都是直到需要时才去访问数据库。除非绝对必要,Hibernate不会试图去把整个集合都抓取到内存里来(适用于非常大的集合)。

Java代码收藏代码
  1. //lazy="extra"
  2. Queryq=session.createQuery("fromUserModel");
  3. Iteratorit=q.iterate();System.out.println(((UserModel)it.next()).getFarms().size());
  4. //或
  5. List<UserModel>userList=q.list();System.out.println(userList.get(0).getFarms().size());
  6. Hibernate:selectusermodel0_.uuidascol_0_0_fromTBL_USERusermodel0_
  7. Hibernate:select…fromTBL_USERusermodel0_whereusermodel0_.uuid=?
  8. Hibernate:selectcount(uuid)fromTBL_FARMwherefk_user_id=?
  9. //或
  10. Hibernate:select…fromTBL_USERusermodel0_
  11. Hibernate:selectcount(uuid)fromTBL_FARMwherefk_user_id=?

对于调用size()、contains、isEmpty是一种优化,不读取所有级联,而是按条件生产不同的sql。

Proxy fetching,代理抓取-对返回单值的关联而言,当其某个方法被调用,而非对其关键字进行get操作时才抓取。

Java代码收藏代码
  1. //默认<many-to-onename="user"……lazy="false"/>
  2. FarmModelfarm=(FarmModel)session.get(FarmModel.class,121);
  3. System.out.println(farm.getUser().getUuid());
  4. Hibernate:select…fromTBL_FARMfarmmodel0_wherefarmmodel0_.uuid=?
  5. Hibernate:select…fromTBL_USERusermodel0_whereusermodel0_.uuid=?
  6. 118

Java代码收藏代码
  1. //<many-to-onename="user"……lazy="proxy"/>
  2. FarmModelfarm=(FarmModel)session.get(FarmModel.class,121);
  3. System.out.println(farm.getUser().getUuid());
  4. Hibernate:select…fromTBL_FARMfarmmodel0_wherefarmmodel0_.uuid=?
  5. 118

注:如果constrained="false"或基于主键的一对一, 不可能使用代理,Hibernate会采取预先抓取!

"No-proxy" fetching,非代理抓取-对返回单值的关联而言,当实例变量被访问的时候进行抓取。与上面的代理抓取相比,这种方法没有那么“延迟”得厉害(就算只访问标识符,也会导致关联抓取)但是更加透明,因为对应用程序来说,不再看到proxy。这种方法需要在编译期间进行字节码增强操作,因此很少需要用到。

Lazy attribute fetching,属性延迟加载-对属性或返回单值的关联而言,当其实例变量被访问的时候进行抓取。需要编译期字节码强化,因此这一方法很少是必要的。

这里有两个正交的概念:关联何时被抓取,以及被如何抓取(会采用什么样的SQL语句)。不要混淆它们!我们使用抓取来改善性能。我们使用延迟来定义一些契约,对某特定类的某个脱管的实例,知道有哪些数据是可以使用的。

九、抓取优化

1、集合N+1:

可以使用batch-size来减少获取次数,即如batch-size=”10”,则是N/10+1。

开启二级缓存。

对于集合比较小且一定会用到的可采用fetch=”join”,这样只需一条语句。

2、笛卡尔积问题:

Java代码收藏代码
  1. <setname="farms"cascade="all,all-delete-orphan"inverse="true"fetch="join">
  2. <keycolumn="fk_user_id"/>
  3. <one-to-manyclass="cn.javass.h3test.model.FarmModel"/>
  4. </set>
  5. <setname="hourses"cascade="all,all-delete-orphan"inverse="true"fetch="join">
  6. <keycolumn="fk_user_id"/>
  7. <one-to-manyclass="cn.javass.h3test.model.HourseModel"/>
  8. </set>

如上配置产生笛卡尔积问题。

select user.*,farm.*,hourse.* from UserModel user, FarmModel farm, HourseModel hourse

where user.uuid=farm.fk_user.uuid(+) and

user.uuid=hourse.fk_user.uuid(+)

解决方案:

1、fetch=”subselect”,子查询,每个User查询一套笛卡尔积

2、完全不采用关系映射。

3、大集合采用批处理,按块获取集合数据

4、复杂SQL太复杂太慢:找DBA优化,索引等是否有效,是否加载了过多的无用数据,拆分SQL,按需获取数据。

5、按需获取1对多中的集合。

6、缓存

……

不当之处,请多多指正!


原文地址:http://jinnianshilongnian.iteye.com/blog/1522591

分享到:
评论

相关推荐

    hibernate 二级缓存收集、总结、整理

    Hibernate作为一个成熟的ORM(对象关系映射)框架,它通过引入缓存机制极大地提高了数据访问的效率。Hibernate二级缓存是其重要的特性之一,主要作用是减少对数据库的直接访问,减少数据库压力,提高系统性能。 ...

    spring struts hibernate 自己整理的 很不错 收集了许多题型

    1. **资源管理**:Hibernate简化了与数据库的交互过程,通过对象关系映射(ORM)技术,提供了比JDBC更高级的数据访问抽象。 2. **持久化层**:Hibernate充当应用程序和数据库之间的桥梁,减少了开发者在数据持久化...

    hibernate例子程序SSH.part01.rar

    【描述】提到的内容表明,这个程序源码可能是尚学堂教程的一部分,作者可能花费了大量时间和精力来收集和整理,旨在帮助学习者更好地理解和应用Hibernate。这个压缩包很可能是分卷文件,可能需要下载所有部分才能...

    hibernate 学习笔记

    - 共享需求:互联网的核心在于信息的收集、整理与发布,持久化支持数据的跨平台共享。 - 检索需求:大数据环境下高效的数据检索变得尤为重要。 - 管理需求:包括数据备份、安全性保障等。 #### 二、ORM和...

    达内项目 基于Struts+Hibernate的网上问卷调查系统_李统华

    3. 数据分析:系统能够自动收集和整理调查结果,提供统计图表和数据导出功能,帮助用户分析反馈信息。 4. 用户管理:支持用户注册、登录、密码找回等功能,确保数据的安全性和用户权限的控制。 5. 权限控制:可能...

    java经常用到的面试题,多年收集公司的面试资料整理

    Hibernate作为ORM(对象关系映射)框架,面试常问的有实体关系映射配置、查询语言(HQL)使用、缓存策略、性能优化等。了解第二级缓存、延迟加载、批处理更新等高级特性是加分项。 ### 第十章 数据库篇 数据库知识...

    java上万个实例源代码例子 链接搜集

    根据提供的标题、描述以及部分内容,我们可以总结出一系列与Java编程语言相关的知识点,特别是与实例源代码及Hibernate框架有关的部分。接下来将对这些知识点进行详细解释。 ### 一、Java实例源代码 #### 1. Java...

    大学毕业设计java+mysql crm客户关系管理系统.zip

    Spring框架常用于处理依赖注入和事务管理,Hibernate则作为对象关系映射工具,帮助开发者将数据库操作转化为面向对象的方式。 2. **MySQL数据库**: MySQL是一款开源、免费的关系型数据库管理系统,因其高效、稳定...

    java-java面试题库整理-基础-JVM-线程并发-框架等.zip

    - Hibernate框架:了解ORM思想,使用Hibernate进行对象关系映射。 - Struts或Spring MVC:对比分析两种MVC框架的优缺点,选择合适的应用场景。 - 设计模式:掌握常见的设计模式,如单例、工厂、代理、装饰、观察...

    ssh实现的科技项目申报(文档+源码+数据库脚本)

    - 信息收集:整理项目背景、市场需求、技术现状等资料。 - 文档编写:使用SSH框架开发的系统可能包含项目申请书、可行性研究报告、预算报告等。 - 数据管理:通过数据库脚本来管理和存储项目信息,如项目名称、负责...

    java面试题整理集合

    - **ORM框架**:如Hibernate、MyBatis,将对象与数据库表映射。 以上只是部分Java面试中常见的知识点,实际面试可能会涉及更多高级主题,如设计模式、JVM优化、分布式系统、微服务架构等。持续学习和实践是提升...

    JAVA核心知识点整理

    ORM(对象关系映射)框架如Hibernate简化了这些操作。 以上只是部分关键知识点,"JAVA核心知识点整理.pdf"文件可能包含了更详细的内容,如设计模式、并发编程、JPA、微服务架构等。深入学习和实践这些知识点,将使...

    JAVA核心面试知识整理.zip

    9. **框架应用**:熟悉Spring、MyBatis、Hibernate等常用框架,并能解释它们的核心功能和使用方式,例如Spring的依赖注入、AOP、事务管理,MyBatis的动态SQL,Hibernate的对象关系映射等。 以上知识点是Java面试中...

    全国大学1000多门20000多课时课程在线看 软件工程 PPT

    1. “马士兵hibernate学习笔记.doc”和“马士兵hibernate学习笔记(文字整理版).doc”:这两份文档可能是关于Hibernate框架的学习资料,Hibernate是Java中常用的ORM(对象关系映射)框架,用于简化数据库操作。...

    高级JAVA面试——最全的总结

    - 垃圾回收:了解各种GC算法,如分代收集、标记-清除、复制、标记-整理、CMS、G1等。 - 内存模型:堆、栈、方法区、本地方法栈、程序计数器的结构和作用。 10. **数据库** - SQL语句:DML、DDL、DQL、DCL操作,...

    个人学习收集

    2. "Hibernate.doc" - Hibernate是一个流行的Java对象关系映射(ORM)框架,它简化了数据库操作。文档可能包含了Hibernate的基本概念,如实体类、配置文件、Session工厂、查询语言(HQL)等,还可能讨论了事务管理、...

    CRM管理系统项目

    1. **需求分析**:明确CRM系统的功能需求,收集并整理业务流程。 2. **设计阶段**:设计数据库模型,绘制ER图;规划系统架构,确定技术栈。 3. **编码实现**:按照SSH框架的规范编写Action、Service、DAO层代码,...

    数据采集系统

    数据采集系统是信息技术领域中的一个重要组成部分,主要用于从各种来源收集、整理和处理数据。在这个系统中,SSH(Spring、Hibernate、Struts)是一个常见的技术栈,而SpringMVC则作为一个微服务架构的一部分,用于...

    ssh所需全部jar

    - Hibernate是一个对象关系映射(ORM)工具,处理数据库操作。 - 必要的jar包包括:`hibernate-core.jar`(核心库)、`hibernate-entitymanager.jar`(JPA支持)、`hibernate-validator.jar`(校验框架)、`mysql-...

Global site tag (gtag.js) - Google Analytics