- 浏览: 660409 次
- 性别:
- 来自: 常州
文章分类
- 全部博客 (345)
- java (63)
- Struts2 (11)
- Spring2.5 + (17)
- Hibernate (25)
- Struts2 Spring hibernate (5)
- log4j (3)
- apache tomcat (12)
- oracle (22)
- oracle_存储过程 (4)
- mysql (18)
- jquery (11)
- prototype (5)
- js (19)
- quartz (5)
- 设计模式 (6)
- eclipse/MyEclipse 注意事项 (9)
- eclipse (0)
- css (6)
- 正则表达式 (2)
- linux (18)
- PHP (6)
- 多线程 (20)
- XML (1)
- jstl (3)
- mongoDB (7)
- android (20)
- 反射 (1)
- IOS (46)
- SVN (3)
- C/C++ (4)
- 百度地图 (2)
- IO/SOCKET (3)
- 百度地图JS (1)
- 树莓派/香蕉派 (1)
最新评论
-
anny101:
想转发一下,不知道怎么转发。评论一下吧。方便查看。
fetch = FetchType.EAGER 作用 -
Navee:
果然我这也是是防火墙问题
解决 Linux 安装 httpd局域网无法访问 -
dhyang909:
...
oracle 10g+ 行列转换 -
国产希特勒:
真强,居然有人把公司的面试题挂到javaeye上了
锦江国际的一道面试题(很简单) -
tomfish88:
比如我要拦截不同业务的service类里面的方法 @Poi ...
Spring AOP annotation 拦截表达式 分析
如果是EAGER,那么表示取出这条数据时,它关联的数据也同时取出放入内存中
如果是LAZY,那么取出这条数据时,它关联的数据并不取出来,在同一个session中,什么时候要用,就什么时候取(再次访问数据库)。
但是,在session外,就不能再取了。用EAGER时,因为在内存里,所以在session外也可以取。
一般只在一边设Eager,JPA接口默认为一对多为Lazy,多对一为Eager,但是Hibernate反向工程生成Entity时,多对一为Lazy,需要手动改为Eager。
而两边都设Eager,那么代码中取一条记录时,会发2次SQL。
Tgroup:
package com.hibernate.entity; import java.util.HashSet; /** * Tgroup entity. @author MyEclipse Persistence Tools */ @Entity @Table(name = "tgroup", catalog = "test") public class Tgroup implements java.io.Serializable { // Fields /** * */ private static final long serialVersionUID = -7208715716759269846L; private Integer id; private String name; private Set<Tuser> tusers = new HashSet<Tuser>(0); // Constructors /** default constructor */ public Tgroup() { } /** full constructor */ public Tgroup(String name, Set<Tuser> tusers) { this.name = name; this.tusers = tusers; } // Property accessors @Id @GeneratedValue @Column(name = "id", unique = true, nullable = false) public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } @Column(name = "name") public String getName() { return this.name; } public void setName(String name) { this.name = name; } @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "tgroup") public Set<Tuser> getTusers() { return this.tusers; } public void setTusers(Set<Tuser> tusers) { this.tusers = tusers; } }
Tuser:
package com.hibernate.entity;
import javax.persistence.Column;
/**
* Tuser entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "tuser", catalog = "test")
public class Tuser implements java.io.Serializable {
// Fields
/**
*
*/
private static final long serialVersionUID = -7792597282750540598L;
private Integer id;
private Tgroup tgroup;
private String name;
// Constructors
/** default constructor */
public Tuser() {
}
/** full constructor */
public Tuser(Tgroup tgroup, String name) {
this.tgroup = tgroup;
this.name = name;
}
// Property accessors
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@ManyToOne(fetch = FetchType.EAGER)//注意这行代码
@JoinColumn(name = "groupid")
public Tgroup getTgroup() {
return this.tgroup;
}
public void setTgroup(Tgroup tgroup) {
this.tgroup = tgroup;
}
@Column(name = "name")
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
当
@ManyToOne(fetch = FetchType.EAGER)//注意这行代码 @JoinColumn(name = "groupid") public Tgroup getTgroup() { return this.tgroup; }
时
@Test public void getUser() { Session s = sessionFactory.getCurrentSession(); s.beginTransaction(); Tuser user = (Tuser)s.get(Tuser.class, 1); System.out.println(user.getName()); s.getTransaction().commit(); System.out.println(user.getTgroup().getName());//这行代码OK,当然,也可以把这行代码放在commit()之前 }
如果
@ManyToOne(fetch = FetchType.LAZY)//注意这行代码 @JoinColumn(name = "groupid") public Tgroup getTgroup() { return this.tgroup; }
时,
@Test public void getUser() { Session s = sessionFactory.getCurrentSession(); s.beginTransaction(); Tuser user = (Tuser)s.get(Tuser.class, 1); System.out.println(user.getName()); s.getTransaction().commit(); System.out.println(user.getTgroup().getName());//这行代码错误,不过,这行代码放在commit()之前,是正确的。 }
评论
3 楼
anny101
2014-04-09
想转发一下,不知道怎么转发。评论一下吧。方便查看。
2 楼
hongmin118
2012-03-22
fenglin_Java 写道
当。。。时和如果。。。时,我们怎么看的一样的代码阿?
Eager应该写成Lazy
不好意思。。。
1 楼
fenglin_Java
2012-03-20
当。。。时和如果。。。时,我们怎么看的一样的代码阿?
发表评论
-
OneToMany字段序列化 failed to lazily initialize a collection of role
2014-06-06 18:51 1507hibernate项目中,如果要对onetomany的po ... -
hibernate 本地查询 字段别名 映射到 DTO时注意事项
2014-04-22 13:54 3551本地原生SQL: SELECT pole.pId as ... -
实体中的数据库字段有关键字
2014-03-26 15:08 1023mysql中如果表的字段设成了关键字,那么在做某些操作时会抛 ... -
Spring +hibernate 声明式 事物 + annotation
2012-03-22 19:49 951在applicationContext.xml中 &l ... -
Hibernate distinct
2012-02-15 18:05 1094/** * 得到大区编号和名称 * @ret ... -
@Transactional 事务回滚 分析
2011-11-08 16:51 4316@Transactional 事务回滚 Spring的 ... -
Hibernate 性能优化_3
2011-10-25 15:54 637二级缓存 对于二级缓存,其实并不一定要在项目中使用 ... -
Hibernate 性能优化_2
2011-10-20 17:51 854createQuery("FROM ****&quo ... -
Hibernate 性能优化_1
2011-10-18 18:39 1008大概如此:不一定说在每个项目中都合适 1、 使用se ... -
Hibernate 的 Criteria用法,完整的一个例子
2011-10-18 16:49 1147数据库: /* MySQL Data Transfer ... -
转的:Hibernate 的 Criteria用法
2011-10-18 16:37 1338方法 说明 Restric ... -
Hibernate 的 join
2011-10-18 13:29 1013转的: 1.如果没有在Hibernate配置里做关 ... -
用myeclipse的Hibernate 反向引擎 生成 数据库的 entity
2011-09-22 14:44 8856把 Myeclipse 转到DB Browser 新建 ... -
Hibernate annotation 多对多双向关联(很少用)
2011-09-21 16:44 1715双向关联 在认为的 主表 上用到 @JoinTable ... -
Hibernate annotation 多对多单向关联
2011-09-21 16:33 1628package com.hibernate.entity ... -
Hibernate annotation 一对多,多对一
2011-09-21 16:03 1976package com.hibernate.entity ... -
Hibernate annotation 联合主键
2011-09-20 15:31 1558Hibernate annotation 联合主键 ... -
Hibernate annotation 的各种关系
2011-09-15 15:59 1019转的: 一、@OneToOne Java ... -
Hibernate 双向关联
2011-09-15 15:55 1001不管是啥关联,只要是双向,都必须用到mappedBy ... -
OneToOne annotation 双向关联
2011-09-15 15:51 1207package com.hibernate.entity ...
相关推荐
对于一对多的关系,可以使用`@OneToMany(fetch = FetchType.EAGER)`或`@ManyToOne(fetch = FetchType.EAGER)`来指定。然而,过度使用急加载可能会导致性能下降,因为它会增加初始查询的复杂性和数据量。 2. Batch ...
在`@OneToMany`注解中,需要指定集合类型和实现类,例如`mappedBy = "parent", targetEntity = Child.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)`。 4. **孤儿删除**:`...
`@ManyToOne(fetch = FetchType.EAGER)`表示多对一关系的加载策略为立即加载,`@OneToMany(fetch = FetchType.LAZY)`表示一对多关系的懒加载。 5. 源码分析: 压缩包中的`s2sh_relation12_one2many_many2one_bi_...
根据题目中的描述,“Hibernate的两个类设置了manyToOne之后,在查询的时候,由于N对1的一方默认的fetch=FetchType.EAGER,所以会把被关联的对象一起取出来”。这表明,在进行查询时,默认情况下,当一个实体包含另一...
2. 使用Eager Loading(即`FetchType.EAGER`)预加载关联数据,减少SQL查询次数。 3. 使用Spring Data的`@Query`注解自定义SQL或HQL,进行更精细的数据加载控制。 4. 考虑使用批次加载(Batch Fetching),减少...
4. **fetch**:加载策略,FetchType.LAZY表示延迟加载,FetchType.EAGER表示立即加载。 5. **optional**:是否允许为null,true表示可以为null,false表示不能为空。 6. **mappedBy**:用于指定另一方的引用字段,...
@OneToMany(cascade = {CascadeType.REMOVE, CascadeType.PERSIST}, mappedBy = "product", fetch = FetchType.EAGER) @OrderBy("visible desc, id asc") @SearchableReference public Set<ProductStyle> get...
可以通过在实体关系映射中设置`fetch=FetchType.EAGER` 来实现。 4. **Batch Size**: Hibernate允许设置批处理大小,以减少数据库交互次数。例如,`@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL,...
这可以通过`@Basic(fetch = FetchType.EAGER)`或XML映射中的`fetch="EAGER"`实现。 四、性能优化策略 1. 使用流处理:对于大数据字段,避免一次性加载到内存中,而是使用流式读写。Hibernate支持通过`InputStream`...
- 使用`fetch = FetchType.EAGER`来立即加载关联对象,适合关联数据较小的情况。 - 适当使用`@Cacheable`和二级缓存,减少数据库访问。 ### 7. 结论 理解并熟练掌握Hibernate的一对一关联映射对于提高Java开发效率...
- `@ManyToOne(fetch = FetchType.EAGER)` FetchType 注解用于控制关联关系的加载策略。LAZY表示延迟加载,直到真正需要时才加载关联对象;EAGER则表示立即加载。 7. **自动生成(GeneratedValue)策略** `...
即时加载(EAGER)则会在加载主对象时一起加载关联对象,可以通过`fetch = FetchType.EAGER`来设置。 **5. 实际应用** 一对一关联在很多场景下都有应用,如用户和其个人资料,车辆和其所有者等。这种关联关系可以...
如果希望在加载主实体时一并加载关联实体,可以使用`fetch = FetchType.EAGER`。 2. **级联操作**:使用`cascade`属性可以定义级联操作,如`CascadeType.ALL`将允许在操作主体实体时自动处理关联实体的CRUD操作。 ...
这可以通过在映射关系上设置`fetch = FetchType.EAGER`实现。 #### 5.2 延迟加载(LAZY) 延迟加载允许在需要时才加载关联的实体,提高性能。设置`fetch = FetchType.LAZY`实现。需注意,懒加载在实体已脱管时无法...
2. **Eager Fetching**:通过设置`fetch = FetchType.EAGER`,在初始加载实体时就加载关联的对象。但这可能导致性能下降,因为即使不需要关联对象,也会加载它们。 3. **Hibernate的Hibernate.initialize()方法**:...
立即加载(Eager Loading)则是在查询时就加载关联对象,通常通过`fetch = FetchType.EAGER`实现。 **HQL 和 Criteria 查询** HQL(Hibernate Query Language)是面向对象的查询语言,类似SQL,但操作的是对象。...
急加载可以通过`@ManyToOne(fetch = FetchType.EAGER)`等方式设置。 在提供的`JPADemo1`压缩包中,可能包含了创建实体、配置`persistence.xml`、执行基本的增删改查操作以及可能的事务管理示例代码。通过学习和理解...
@Basic(fetch = FetchType.EAGER) private String username; // ... } ``` 其中,`fetchType`可以设置为`EAGER`或`LAZY`,分别表示立即加载和延迟加载。 7. `@ManyToOne`, `@OneToOne`, `@OneToMany`, `@...