JPA关联

关联(JPA注解关联)

数据库需求表:
图书详情表:
CREATE TABLE book_info (
book_id bigint(20) NOT NULL AUTO_INCREMENT,
book_name varchar(100) DEFAULT NULL,
book_author varchar(100) DEFAULT NULL,
book_price double DEFAULT NULL,
book_date bigint(20) DEFAULT NULL,
book_publish varchar(100) DEFAULT NULL,
book_desc varchar(200) DEFAULT NULL,
type_id bigint(20) DEFAULT NULL,
PRIMARY KEY (book_id),
KEY type_id (type_id),
CONSTRAINT FK2tmm8w07nk0i13mqlho6jdkcf FOREIGN KEY (type_id) REFERENCES book_type (type_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;

图书分类表 :

CREATE TABLE book_type (
type_id bigint(20) NOT NULL AUTO_INCREMENT,
type_name varchar(100) DEFAULT NULL,
type_desc varchar(200) DEFAULT NULL,
PRIMARY KEY (type_id)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8;

开发流程
第一步:创建WEB项目,加入核心配置文件
注册多个实体
与之前保持一致

image.png

注意方言:org.hibernate.dialect.MySQL55Dialect
映射建表注意:
<property name="hibernate.hbm2ddl.auto" value="update" />

在DB中可先创建好表

第二步:创建注解的ORM映射实体类
手动建表注意POJO属性和表的字段映射一致,或者使用@Column可以做映射。
使用JPA实现的目标:
Hibernate的方式:有实体类和ORM映射文件

image.png

JPA目标:只有注解的实体类(包含ORM映射关系)

多对一:
@ManyToOne
@JoinColumn(name="type_id")//描叙关联字段
private BookType bookType;//多对一关系

一对多:
@OneToMany(mappedBy=“bookType”)//关联对象定义的变量,也就是多对一关系中对象的属性名称。在多对一关系的时候指定了字段,这里不需要再指定字段。
private Set<BookInfo> bookInfos = new HashSet<BookInfo>(0);//一对多关系

@Entity
@Table(name = "book_info")
public class BookInfo {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "book_id")
private Long bookId;
@Column(name = "book_name")
private String bookName;
@Column(name = "book_author")
private String bookAuthor;
@Column(name = "book_price")
private Double bookPrice;
@Column(name = "book_date")
private Long bookDate;
@Column(name = "book_publish")
private String bookPublish;
@Column(name = "book_desc")
private String bookDesc;

@ManyToOne
@JoinColumn(name = "type_id")
private BookType bookType;//多对一的关联,一定不要定义单个的type_id字段。

public Long getBookId() {
return bookId;
}

public void setBookId(Long bookId) {
this.bookId = bookId;
}

public String getBookName() {
return bookName;
}

public void setBookName(String bookName) {
this.bookName = bookName;
}

public String getBookAuthor() {
return bookAuthor;
}

public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}

public Double getBookPrice() {
return bookPrice;
}

public void setBookPrice(Double bookPrice) {
this.bookPrice = bookPrice;
}

public Long getBookDate() {
return bookDate;
}

public void setBookDate(Long bookDate) {
this.bookDate = bookDate;
}

public String getBookPublish() {
return bookPublish;
}

public void setBookPublish(String bookPublish) {
this.bookPublish = bookPublish;
}

public String getBookDesc() {
return bookDesc;
}

public void setBookDesc(String bookDesc) {
this.bookDesc = bookDesc;
}

public BookType getBookType() {
return bookType;
}

public void setBookType(BookType bookType) {
this.bookType = bookType;
}
}

@Entity
@Table(name = "book_type")
public class BookType {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "type_id")
private Long typeId;
@Column(name = "type_name")
private String typeName;
@Column(name = "type_desc")
private String typeDesc;
//一对多
@OneToMany(mappedBy = "bookType")//这个名称和BookInfo中关联对象属性的名称一致
private Set<BookInfo> books = new HashSet<BookInfo>();

public Long getTypeId() {
return typeId;
}

public void setTypeId(Long typeId) {
this.typeId = typeId;
}

public String getTypeName() {
return typeName;
}

public void setTypeName(String typeName) {
this.typeName = typeName;
}

public String getTypeDesc() {
return typeDesc;
}

public void setTypeDesc(String typeDesc) {
this.typeDesc = typeDesc;
}

public Set<BookInfo> getBooks() {
return books;
}

public void setBooks(Set<BookInfo> books) {
this.books = books;
}
}

注册实体:

image.png

public class BookTypeDAO {

public void addType(BookType bookType){
EntityManager entityManager = JPAUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.persist(bookType);
transaction.commit();
entityManager.close();

}

public static void main(String[] args) {
BookType bookType = new BookType();
bookType.setTypeName("好好学习");
bookType.setTypeDesc("天天向善");
BookTypeDAO dao = new BookTypeDAO();
dao.addType(bookType);
}

}

public class BookInfoDAO {

public void addBook(BookInfo pojo){
EntityManager entityManager = JPAUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.persist(pojo);
transaction.commit();
entityManager.close();
}

public static void main(String[] args) {
BookInfo pojo = new BookInfo();
pojo.setBookName("Java入门到放弃");
pojo.setBookAuthor("二货");
pojo.setBookDesc("二一回");
pojo.setBookPublish("回收站");
pojo.setBookPrice(8.9);
pojo.setBookDate(System.currentTimeMillis());
//关联对象
BookType byId = new BookTypeDAO().findById(32L);
pojo.setBookType(byId);
BookInfoDAO dao = new BookInfoDAO();
dao.addBook(pojo);

}

}
注意图书关联了分类对象。

注解的检索方式

延迟检索:(一对多的默认检索方式)
@ManyToOne(fetch=FetchType.LAZY)
立即检索:(多对一的默认检索方式)
@OneToMany(mappedBy="friendtype",fetch=FetchType.EAGER)

多对一默认是立即检索

直接获取分类信息,打印分类信息不打印SQL。

public void findById(Long id){
EntityManager entityManager = JPAUtils.getEntityManager();
BookInfo bookInfo = entityManager.find(BookInfo.class, id);
//主表
System.out.println(bookInfo.getBookName());
System.out.println("============================");
//关联表
BookType bookType = bookInfo.getBookType();
System.out.println(bookType.getTypeName());
entityManager.close();
}

修改为延迟检索:

第一步:修改配置:

image.png
image.png
image.png

第二步:核心代码
打印关联表信息时,同时发出SQL语句查询。注意Idea需要用运行模式测试。

public BookType findById(Long typeID){
EntityManager entityManager = JPAUtils.getEntityManager();
BookType bookType = entityManager.find(BookType.class, typeID);
//主表
System.out.println(bookType.getTypeName());
System.out.println("============================");
//关联表
Set<BookInfo> books = bookType.getBooks();
for (BookInfo book : books) {
System.out.println(book.getBookName());
}

entityManager.close();
return bookType;
}

一对多默认是延迟检索:

image.png

观察SQL:

image.png

修改为立即检索:

第一步:POJO中加入立即检索

image.png

第二步:代码

public void findByTypeId(Long id){
EntityManager entityManager = JPAUitls.createSession();
BookType bookType = entityManager.find(BookType.class, id);
System.out.println(bookType.getTypeName());
System.out.println("====================================================");
System.out.println("分类对应的图书信息:");
Collection<BookInfo> bookInfosByTypeId = bookType.getBookInfosByTypeId();
for (BookInfo bookInfo : bookInfosByTypeId) {
System.out.println(bookInfo.getBookName()+"\t"+bookInfo.getBookAuthor());
}
entityManager.close();
}

观察:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,865评论 6 518
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,296评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 169,631评论 0 364
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,199评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,196评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,793评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,221评论 3 423
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,174评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,699评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,770评论 3 343
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,918评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,573评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,255评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,749评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,862评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,364评论 3 379
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,926评论 2 361

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,719评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,668评论 18 399
  • 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 上边使...
    哇哈哈E阅读 3,312评论 0 38
  • 一、什么是酵素 朋友们有可能是跟我当初一样,第一次听说酵素。那我就先来介绍一下,什么是酵素? 酵素是一种很伟大又神...
    霞儿_6ef4阅读 1,446评论 0 0
  • 最近朋友小米跟我闲聊抱怨:“上下班途中地铁里简直是地狱!”在这个拥挤的空间里,总会有人不小心踩到她的脚,触碰到她身...
    Marowak阅读 2,090评论 0 2