- 浏览: 570095 次
文章分类
- 全部博客 (235)
- 数据库 (12)
- j2se (10)
- JQuery (2)
- 经验总结 (4)
- 防毒 (1)
- Struts (20)
- Spring (12)
- 项目 (3)
- 电脑维修项目 (1)
- Eclipse (2)
- JSP (13)
- mysql (5)
- Hibernate (54)
- ssh (1)
- 学习网站 (1)
- tomcat (9)
- servlet (24)
- java语言基础 (1)
- jbpm (1)
- linux (0)
- 技巧积累 (1)
- javaBean (2)
- 设计模式 (2)
- 实用的操作 (9)
- oracle (1)
- UML学习 (1)
- 版本控制 (1)
- 框架 (9)
- javaWeb基础 (13)
- c语言 (0)
- ant (0)
- 关于权限 (3)
- 真正开发有用 (5)
- javascript (2)
- 算法 (1)
- J2EE (1)
- junit (1)
最新评论
-
alleni123:
不错 一搜就搜到这个了
ssession和servletContext的比较 -
hua7381:
楼主,你真实帮了大忙了!!
万能乱码处理---url传中文 -
albrich:
1楼是正解
摘] 装了个Tomcat遇到的问题 -
JA_mcj:
ssession和servletContext的比较 -
haotw:
看了很有帮助,总算对hibernate的延迟加载有一定的了解了 ...
[转]hibernate延迟加载
对于新系统的设计开发而言,我们应尽量避免在库表中引入与业务逻辑相关的主键关系。将业务逻辑主键引入库表,以后业务逻辑的变化,将很可能对底层数据库结构产生连带影响。复合主键的引入,很大程度上意味着业务逻辑已经侵入到数据存储逻辑之中。因此,应尽量避免。但实际情况中,我们必须面对遗留系统的旧表开发,这时,对现有复合主键的支持就非常必要。
hibernate中,通过composite-id节点对复合主键进行定义。
我们可以通过两种形式确定主键:
1)基于实体类属性的复合主键
2)基于主键类的复合主键
下面通过例子看一下两种方式的用法。
我们建一个用户表user(firstname, lastname, age),以firstname, lastname作为复合主键。建表语句:
CREATE TABLE `hbm_test`.`user` (
`firstname` VARCHAR(50) NOT NULL DEFAULT '',
`lastname` VARCHAR(50) NOT NULL DEFAULT '',
`age` INTEGER UNSIGNED DEFAULT 0,
PRIMARY KEY(`firstname`, `lastname`)
)
ENGINE = InnoDB;
1)基于实体类属性的复合主键
映射文件如下:
- <class name="User" table="user">
- <composite-id>
- <key-property
- name="Lastname"
- column="lastname"
- type="string"
- />
- <key-property
- name="Firstname"
- column="firstname"
- type="string"
- />
- </composite-id>
- <property
- name="Age"
- column="age"
- type="integer"
- not-null="false"
- length="10"
- />
- </class>
通过composite-id节点声明了一个复合主键,是由“firstname" "lastname"组成。
实体类User中包含了复合主键firstname lastname,hibernate要求复合主键类实现equals hashCode,以作为不同数据间的识别的标志。
- public class User implements Serializable{
- private String firstname;
- private String lastname;
- private int age;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getFirstname() {
- return firstname;
- }
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
- public String getLastname() {
- return lastname;
- }
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
- public boolean equals(Object obj){
- if(!(obj instanceof User)){
- return false;
- }else{
- User user = (User)obj;
- return new EqualsBuilder().appendSuper(super.equals(obj))
- .append(this.firstname, user.firstname)
- .append(this.lastname, user.lastname)
- .isEquals();
- }
- }
- public int hashCode(){
- return new HashCodeBuilder(-528253723, -475504089)
- .appendSuper(super.hashCode())
- .append(this.firstname)
- .append(this.lastname)
- .toHashCode();
- }
- }
EqualsBuilder HashCodeBuilder均为 apache common lang包中的工具类。
对于Session.load方法,我们可将User类对象本身作为查询条件:
- User user = new User();
- user.setFirstname("hello");
- user.setLastname("world");
- user = (User)session.load(User.class, user);
- System.out.println("age: " + user.getAge());
2)基于主键类的复合主键
我们可以将主键逻辑加以分离,以一个单独的主键类对复合主键进行描述。
现在把User中的firstname lastname提取到一个独立的主键类UserPK中:
- public class UserPK implements Serializable{
- private String firstname;
- private String lastname;
- public String getFirstname() {
- return firstname;
- }
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
- public String getLastname() {
- return lastname;
- }
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
- }
之后修改映射文件的composite-id节点:
- <composite-id name="userPk" class="UserPK">
- <key-property
- name="Lastname"
- column="lastname"
- type="string"
- />
- <key-property
- name="Firstname"
- column="firstname"
- type="string"
- />
- </composite-id>
- <property
- name="Age"
- column="age"
- type="integer"
- not-null="false"
- length="10"
- />
只是配置了name和class属性,name指定了实体类中的主键类属性名,class指定了主键类类型。
User.java修改如下:
- public class User implements Serializable{
- private UserPK userPk;
- private int age;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public UserPK getUserPk() {
- return userPk;
- }
- public void setUserPk(UserPK userPk) {
- this.userPk = userPk;
- }
- }
之后,我们即可通过UserPK进行数据查询:
- UserPK userPk = new UserPK();
- userPk.setFirstname("hello");
- userPk.setLastname("world");
- User user = (User)session.load(User.class, userPk);
- System.out.println("age: " + user.getAge());
发表评论
-
多对多双项关联
2007-12-02 16:39 4088数据库中仍然是利用一个中间表 持久化类中,都各自包含对方的集合 ... -
多对多单项关联
2007-12-02 16:02 44981.多对多单项关联 在数据库中多对多的关系,表之间设置一个中间 ... -
一对一关联
2007-12-02 14:13 3636一对一的关联 分为外键关联和主键关联 外键关联:在关系模型的表 ... -
双向的多对一或者双向的一对多
2007-12-02 00:38 3573一对多或者多对一都是从一方来看, 双向是从两个方向来看 这个时 ... -
一对多的另一个问题
2007-12-02 00:19 3329如果email 的一方设置uid 不能为空的话回报错,所以需要 ... -
做一对多遇到的几个问题(单向)
2007-12-02 00:14 3281java 代码 public class Use ... -
多对一举例(单项的,从一个方向看)
2007-12-01 23:15 3643java 代码 public class Use ... -
hibernate多对一
2007-12-01 22:59 4265处理多对一的时候 感觉关系模型多对一和一对多是一样的 在域模型 ... -
[转]Hibernate中的outer-join(二):fetch
2007-12-01 22:49 4615... -
hibernate中集合排序
2007-12-01 18:49 3692set,map可以支持内存排序和数据库排序 List什么都不支 ... -
[转] hibernate中给集合排序的方法
2007-12-01 18:47 5769<iframe style="MARGIN ... -
[转]集合类型和结果集排序
2007-12-01 18:39 3504言归正传,Hibernate中的Collection类型分为有 ... -
[转]hibernate延迟加载
2007-12-01 18:22 5990hibernate 延迟加载问题探 ... -
[转]主键自动生成办法
2007-12-01 18:11 3431... -
[转]hibernate中的 bag--解释的太好了.
2007-12-01 17:25 20447Bag是集合,与Set不同的是,Bag允许重复的元素, 在Ja ... -
hibernate值类型集合映射之Map
2007-12-01 17:02 2916java 代码 public class Use ... -
hibernate值类型集合映射之List
2007-12-01 16:43 3319java 代码 public class Use ... -
值类型映射---Set(2)
2007-12-01 13:43 3124这里自定义Email类,set里面放的是 email 类,非 ... -
值类型映射---Set(1)
2007-12-01 13:20 3410这里介绍2种不同的域模型的设计, 一种是Set里面装Strin ... -
事务的作用
2007-12-01 12:41 4565事务的作用是为了防止修改数据库, 如果只是查询那么就没必要修改 ...
相关推荐
DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问,通常与ORM框架如Hibernate一起使用,以隔离业务逻辑和数据存储之间的交互。 在给定的代码片段中,`HibernateDAO` 类是用来封装...
在使用 `Session` 时,应当明确区分 Hibernate 中的 `Session` 与 JSP 中的 `HttpSession`,避免混淆。 #### 三、SessionFactory接口 `SessionFactory` 是用来创建 `Session` 对象的工厂,它是线程安全的,通常在...
hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。本文将深入探讨Hibernate的四种主要查询方式:HQL(Hibernate Query...
在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来实现两个实体类之间的这种一对一绑定。下面我们将深入探讨这一主题。 首先,我们需要理解一对一关系的概念。在数据库中,一对一关系意味...
最新springboot2基础hiberante5完整项目,打包jar,运行jsp,包括后台与前台,拦截器,登录,后台下载就可以使用,注意不是jpa,里面有完整Dao,千万级数据项目分离的代码,为了适合老项目开发特意集成hiberante5....
通过在实体类上使用@Entity、@Table、@Id等注解,可以声明对象的数据库映射信息,简化配置。 4. 缓存配置:Hibernate提供了一级缓存和二级缓存,一级缓存是Session级别的,而二级缓存可以通过第三方插件如Ehcache...
《Hibernate中文帮助文档》是Java开发领域中关于Hibernate框架的一份详尽参考资料,它涵盖了Hibernate的各个方面,旨在帮助开发者深入理解和高效使用这个强大的对象关系映射(ORM)工具。Hibernate作为一个开源的ORM...
然后,创建实体类(Entity),这些类代表数据库表,并使用 JPA 注解(如 @Entity, @Table, @Id 等)来指定它们与数据库的关系。DAO(数据访问对象)接口和实现类负责通过 SessionFactory 执行 CRUD(创建、读取、...
在Java项目中使用Hibernate5.0.7,首先需要将这些jar包添加到项目的类路径中。这可以通过Maven或Gradle等构建工具完成,也可以手动将它们放入项目的`lib`目录下,并在IDE中配置类路径。 **三、配置文件** 主要的...
1. SessionFactory:它是整个Hibernate的核心,负责创建Session实例,配置信息(如数据库连接、映射文件等)都在SessionFactory中初始化。 2. Session:Session是与数据库交互的接口,用于执行CRUD操作(创建、读取...
Hibernate Tools是一套全新而且完整的面向Hibernate3的工具集合,它包含了Eclipse插件和Ant编译流程。Hibernate Tools是JBoss Tools的核心组件,所以他也是JBoss Developer Studio的一部分
开发工具:MyEclipse 6....Struts+Spring+Hiberante框架整合的简单登录系统 无需配置任何文件、只需在mysql中创建一个空数据库 如:create database test; 注:mysql数据库用户名:root 密码:root
Spring MVC 和 Hibernate 是两个在Java Web开发中广泛使用的框架,它们分别是用于构建MVC(Model-View-Controller)架构的Web应用和管理数据库操作的对象关系映射(ORM)工具。在实际项目中,这两个框架的集成能提供...
根据提供的文件信息,“hiberante annotations reference.pdf”主要介绍了Hibernate框架中的注解使用方法与参考。下面将基于标题、描述及部分文档内容进行详细的解析。 ### Hibernate注解概述 Hibernate是一个开源...
hiberante4.2.3-part2
描述中的“Hiberante3_HQL”提示我们将会涉及到Hibernate查询语言(HQL),它是面向对象的查询语言,允许开发者以类和对象的方式查询数据库。 “Hibernate3_缓存机制”意味着这部分内容将深入探讨Hibernate如何通过...
总的来说,"Struts2+Hiberante+ajax+Mysql 三级联动"项目展示了如何利用这些技术进行高效的Web开发,特别是在处理多级交互和动态数据展示方面。通过学习和实践这样的项目,开发者可以提升对Java Web开发的理解,尤其...
在部署和使用过程中,开发者或管理员需要理解每个框架的基本原理和配置方法,以便于定制和优化系统。例如,配置Struts2的Action和结果集,设置Hibernate的实体类和映射文件,管理Spring的bean,以及使用ExtJS搭建...
hiberante-4.2.3-part3