1.先定义两个model:Question和Answer,每个Question对应多个Answer;
Question.java
package lan.study.hibernate.model;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Question {
private Integer id;
private String question;
private Set<Answer> answers;
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
@OneToMany(mappedBy="question", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
public Set<Answer> getAnswers() {
return answers;
}
public void setAnswers(Set<Answer> answers) {
this.answers = answers;
}
}
Answer.java
package lan.study.hibernate.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Answer {
private Integer id;
private String answer;
private Question question;
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
@ManyToOne
@JoinColumn(name = "question_id")
public Question getQuestion() {
return question;
}
public void setQuestion(Question question) {
this.question = question;
}
}
2.当OneToMany中加上 fetch=FetchType.EAGER时,查询时会把关联的对象全部加载到内存中,即使使用setFetchMode,也不起作用,而去掉fetch=FetchType.EAGER时,setFetchMode才起作用。
@OneToMany(mappedBy="question", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
public Set<Answer> getAnswers() {
return answers;
}
3.测试代码
package lan.study.hibernate.model;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import lan.study.hibernate.util.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.CriteriaSpecification;
import org.junit.Test;
public class QuestionTestCase {
@Test
public void testSaveQuestion(){
Question question = new Question();
question.setQuestion("question.");
Answer answerA = new Answer();
answerA.setAnswer("answerA");
answerA.setQuestion(question);
Answer answerB = new Answer();
answerB.setAnswer("answerB");
answerB.setQuestion(question);
Answer answerC = new Answer();
answerC.setAnswer("answerC");
answerC.setQuestion(question);
Set<Answer> answers = new HashSet<Answer>();
answers.add(answerA);
answers.add(answerB);
answers.add(answerC);
question.setAnswers(answers);
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(question);
session.getTransaction().commit();
session.close();
}
@Test
public void getQuestionByCriteria(){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Criteria c = session.createCriteria(Question.class);
c.setFetchMode("answers", FetchMode.JOIN);
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
@SuppressWarnings("unchecked")
List<Question> questions = c.list();
session.getTransaction().commit();
System.out.println(questions.size());
for (Question question : questions) {
for(Answer answer : question.getAnswers()){
System.out.println(answer.getAnswer());
}
}
}
@Test
public void getQuestionByHQL(){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
String hql = "select distinct(q) from Question q inner join fetch q.answers where q.id=1";
Query q = session.createQuery(hql);
@SuppressWarnings("unchecked")
List<Question> questions = q.list();
session.getTransaction().commit();
System.out.println(questions.size());
for (Question question : questions) {
for(Answer answer : question.getAnswers()){
System.out.println(answer.getAnswer());
}
}
}
}
HibernateUtil.java
package lan.study.hibernate.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
return new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
分享到:
相关推荐
关联映射通过`@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`注解实现,并可通过`FetchType.LAZY`或`FetchType.EAGER`设置加载策略。 12. **延迟加载(Lazy Loading)**:Hibernate的懒加载机制能有效减少...
根据题目中的描述,“Hibernate的两个类设置了manyToOne之后,在查询的时候,由于N对1的一方默认的fetch=FetchType.EAGER,所以会把被关联的对象一起取出来”。这表明,在进行查询时,默认情况下,当一个实体包含另一...
3.懒加载和立即加载:通过 FetchType.LAZY 和 FetchType.EAGER 控制关联对象的加载时机。 七、性能优化 1. 分页查询:使用Criteria的setFirstResult()和setMaxResults()实现。 2. 避免N+1查询问题:通过批处理或子...
Hibernate 是一款流行的 Java 持久层框架,它提供了对象关系映射(ORM)的功能,能够帮助开发者轻松地将 Java 应用程序中的对象映射到数据库表及其字段。为了简化开发过程,Hibernate 提供了一系列的注解来标记实体...
- `@Basic(fetch = FetchType.LAZY)`: 实现懒加载,只有在真正使用到属性时才去查询数据库。 - `@Fetch(FetchMode.JOIN)`: 强制执行Eager加载,即在查询主实体时一同加载关联的实体。 6. **索引和唯一性注解** -...
在IT行业中,数据库操作是应用程序开发中的重要环节,而Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了这一过程。今天我们要探讨的是Hibernate的抓取策略,特别是针对set集合的策略。在...
这可以通过`@Basic(fetch = FetchType.EAGER)`或XML映射中的`fetch="EAGER"`实现。 四、性能优化策略 1. 使用流处理:对于大数据字段,避免一次性加载到内存中,而是使用流式读写。Hibernate支持通过`InputStream`...
2. **Eager Fetching**:通过设置`fetch = FetchType.EAGER`,在初始加载实体时就加载关联的对象。但这可能导致性能下降,因为即使不需要关联对象,也会加载它们。 3. **Hibernate的Hibernate.initialize()方法**:...
若希望在获取父实体时同时加载子实体,可以设置`fetch = FetchType.EAGER`。 6. **缓存策略**: - Hibernate提供了一级缓存(Session级别)和二级缓存(SessionFactory级别)。合理设置缓存策略可以提高数据读取...
可以通过在实体关系映射中设置`fetch=FetchType.EAGER` 来实现。 4. **Batch Size**: Hibernate允许设置批处理大小,以减少数据库交互次数。例如,`@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL,...
根据提供的标题“Hibernate逍遥游记”以及描述和标签中的关键词“Hibernate PDF”,我们可以推断这份文档可能涵盖了关于Hibernate框架的详细介绍和技术指南。然而,提供的部分内容并没有给出具体的信息,因此我们将...
在Java世界中,ORM(对象关系映射)框架如Hibernate极大地简化了数据库操作。本话题主要探讨的是Hibernate中的一对一关联映射,这是一种将数据库中的单个表映射到Java对象模型中单个类的关系映射技术。通过注解方式...
- **Hibernate生成策略**:可以通过注解`@Basic`来声明属性的存取策略,例如延迟获取(`FetchType.LAZY`)或即时获取(`FetchType.EAGER`)。 - **时间精度映射**:通过`@Temporal`注解定义映射到数据库的时间精度,...
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) @JoinColumn(name="CUST_ID") @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public SortedSet<Ticket> getTickets() { return...
FetchType.LAZY和FetchType.EAGER是两种主要的加载策略,前者对应懒加载,后者则是在加载主对象时同时加载关联对象。 总之,Hibernate的懒加载机制对于提高应用程序的性能和优化数据库交互具有重要意义。开发者需要...
在Java的持久化框架Hibernate中,关系映射是数据库与对象模型之间的重要桥梁。本话题主要探讨两种基本的关系映射类型:many-to-one(多对一)和one-to-many(一对多)。这两种关系映射是数据库中常见的关联类型,...
配置`@ManyToOne`时,同样需要指定`targetEntity`属性,此外还可以设置`fetch`属性来控制关联对象的加载策略,例如`FetchType.LAZY`表示延迟加载,`FetchType.EAGER`表示立即加载。`@JoinColumn`注解用于定义在子类...
- `FetchType.LAZY` 或 `FetchType.EAGER`: 控制关联对象的加载策略,`LAZY`表示延迟加载,只有在需要时才加载关联对象;`EAGER`表示立即加载。 通过上述注解,我们可以轻松地在Java类中描述数据库表结构和对象关系...