Hibernate双向多对一关系
废话不多说,先说说这两个对象。
帐号,就是用户了;相册,当然是用户的相册。用户与相册是一对多关系,反之,相册与用户是多对一关系。现在我们看两个对象的代码。
Account
import java.io.Serializable;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "account")
public class Account implements Serializable {
@Id
@GeneratedValue(generator = "hilo")
@GenericGenerator(name = "hilo", strategy = "hilo")
@Column(name = "account_id")
private long id;// 主键
@Column(name = "name", nullable = false, unique = true)
private String name; // 用户名
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Album.class)
@JoinColumn(name = "account_id", updatable = true)
private List<Album> albumList = new LinkedList<Album>(); // 相册
}
要注意@OneToMany中的cascade,还有@JoinColumn中的updatable
Album
import java.io.Serializable;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "album")
public class Album implements Serializable {
private static final long serialVersionUID = -159468065798255466L;
@Id
@GeneratedValue(generator = "hilo")
@GenericGenerator(name = "hilo", strategy = "hilo")
@Column(name = "album_id")
private long id;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Account.class)
@JoinColumn(name = "account_id")
private Account account;
}
同样注意@ManyToOne中的cascade,与Account中保持一致。
由此生成的sql语句:
alter table album drop foreign key FK5897E6F68D52691
drop table if exists account
drop table if exists album
drop table if exists hibernate_unique_key
create table account (account_id bigint not null, email varchar(255) not null unique, enabled bit not null, gender bit not null, sign_in_date datetime, name varchar(255) not null unique, password varchar(255) not null, point integer not null, sign varchar(255), sign_up_date datetime not null, primary key (account_id))
create table album (album_id bigint not null, create_date datetime not null, url varchar(255) not null unique, account_id bigint, primary key (album_id))
alter table album add index FK5897E6F68D52691 (account_id), add constraint FK5897E6F68D52691 foreign key (account_id) references account (account_id)
CREATE TABLE hibernate_unique_key (next_hi int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (next_hi))
INSERT INTO hibernate_unique_key(next_hi) VALUES(1)
在执行新建用户的时候,同时新建相册,如果没有设定级联,会出
save the transient instance before flushing异常
Account a = new Account("wolf" + System.currentTimeMillis(), "snow");
a.setEmail("snowolf@wolf.org" + System.currentTimeMillis());
a.setGender(true);
// 执行新建用户
long id = accountService.signUp(a);
List<Album> list = new LinkedList<Album>();
list.add(new Album("" + System.currentTimeMillis()));
a.setAlbumList(list);
// 更新相册
accountService.update(a);
生成的执行语句
Hibernate: insert into account (email, enabled, gender, sign_in_date, name, password, point, sign, sign_up_date, account_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into album (account_id, create_date, url, album_id) values (?, ?, ?, ?)
Hibernate: update album set account_id=? where album_id=?
如果 Account中 @JoinColumn(name = "account_id", updatable = true)的updatable设置为false,则不会有 Hibernate: update album set account_id=? where album_id=? 执行,也就是说级联操作时不会做更新操作。
分享到:
相关推荐
这个“struts+spring+hibernate学习笔记”应该涵盖了这三个框架的基础知识以及如何将它们整合使用的详细教程。 Struts是一个基于MVC(Model-View-Controller)设计模式的开源框架,主要用于控制Web应用的流程。它...
本资源包“spring+hibernate学习笔记和项目源代码”提供了深入理解和实践这两个框架的机会,同时也包含了Struts的集成,形成经典的SSH(Spring、Struts、Hibernate)架构。以下是关于这些主题的详细知识解析: 1. *...
系统讲解Spring框架和Hibernate框架。适合搞Java Web开发人员及初学者。
spring+hibernate+jpa+struts1+struts2+springmvc+jquery+freemaker 学习笔记 Compass将lucene、Spring、Hibernate三者结合
Struts、Spring 和 Hibernate 是Java开发中非常著名的三个开源框架,它们在企业级应用开发中起着关键作用。Struts 是一个 MVC(Model-View-Controller)架构的 Web 框架,Spring 提供了一个全面的后端服务管理平台,...
【Spring+Hibernate笔记】这篇文档主要涵盖了在Web开发中使用Spring和Hibernate的基础知识。首先,我们从Spring的Hello World开始,了解如何配置JSP运行环境。 1.1. 配置JSP运行环境是开发Web应用的第一步。这包括...
### Struts + Spring + Hibernate 整合笔记 #### 前言 随着企业级应用的不断发展壮大,单一框架已经难以满足复杂多变的业务需求。因此,将多种框架进行有机整合成为了开发高效率、高性能应用的重要手段之一。本...
SSH项目是一种经典的Java Web开发框架组合,由Spring、Hibernate和Struts2三个开源框架组成。这个项目示例提供了一个基于这些技术的简单应用,帮助开发者理解如何将它们整合在一起进行实际开发。 **Spring框架**是...
快速建立一个基于_jsf+spring+hibernate工程.doc和jsf+spring+hibernate整合笔记.docx可能详细讲述了如何从零开始构建这样的工程,包括环境配置、依赖注入、实体定义、数据访问对象(DAO)的创建以及控制器的设置等...
内涵数据库设计模型 和数据库设计代码! 图书管理系统: ... 里面的发送e-mail我用的是一个我申请的邮箱在测试 可以用自己的! 代码功能基本都有注释.能看懂.. 才学完s2sh的入门笔记吧! 供学习使用........
Struts、Spring和Hibernate是Java开发中非常重要的三个开源框架,它们各自负责Web应用程序的不同层面。Struts主要用于控制层,Spring则是一个全面的框架,涵盖了依赖注入、事务管理、AOP(面向切面编程)等多个方面...
【Struts+Spring+Hibernate 学习总结】 SSH(Struts、Spring、Hibernate)是Java Web开发中的一个经典企业级应用架构,它将MVC设计模式应用到Web应用的各个层次,实现了良好的分层和解耦。这篇学习总结旨在帮助读者...
学习和理解Struts、Spring、Hibernate的整合不仅有助于开发者构建高效的企业级应用,还能提升其在Java开发领域的专业素养。这三个框架的组合提供了良好的分层架构,使得项目更易于维护和扩展,同时也降低了代码的...
SSH是Java开发中广泛使用的三大框架——Struts2、Hibernate和Spring的缩写。这三大框架结合使用,能够构建高效、灵活的企业级Web应用程序。现在,让我们深入探讨这些框架的知识点。 **Struts2笔记** Struts2是MVC...
java(1) 整合入门(spring,struts,hibernate的整合)资料(1) 中大软件工厂项目前培训资料(1) 完整笔记+源码(1) ssh(1) C#查询参数化例子(1) 学习笔记+完整源码(1) 介绍与深入(1) 学习笔记(不含整合)(1) C#(1) .CHM格式...
标题 "Flex+Spring+Hibernate整合视频学习交流part_2" 提示我们这是一段关于将Flex、Spring和Hibernate这三个技术框架整合使用的视频教程的第二部分。这个整合是为了解决前端用户界面、业务逻辑层和服务数据访问层...
而“Struts+Spring+Hibernate整合笔记.txt”则可能记录了整合过程中的关键点、注意事项或者常见问题解决方案。 这些技术的整合能够实现松散耦合,提高代码的可维护性和可扩展性。Struts2处理HTTP请求,Spring管理...
根据给定文件的信息,我们可以总结出关于Spring、Hibernate与...以上就是Spring、Hibernate与Struts2框架使用与整合的主要知识点,通过这些知识点的学习和实践,可以帮助开发者更好地理解和掌握这些框架的使用方法。
本学习笔记将深入探讨这四个组件如何协同工作,构建出强大的企业级应用。 **Struts2** 是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它提供了处理用户请求、控制应用流程的能力。Struts2的核心是...