SpringCloud JAP之如何使用@NameEntity Grapth实现OneToOne关系映射?

SpringCloud JAP之如何使用@NameEntity Grapth实现OneToOne关系映射?

完成:第一遍

1.如何使用@NameEntity Grapth实现OneToOne关系映射?

步骤一:新建Address类

package com.itzhiya.spring.data.jpa;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String country;
    private String province;
    private String city;
    private String detail;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }
}

步骤二:在UserEntity中添加Address引用变量
Address上只需要添加 @OneToOne注解
然后UserEntity上添加

package com.itzhiya.spring.data.jpa;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name="userspringdata", catalog = "springdataproject")
@NamedQuery(name="UserEntity.selectUsersByIdName", query="from UserEntity u where concat(u.uid, u.name) = ?1")
@NamedEntityGraph(name="userentity.all", attributeNodes = {@NamedAttributeNode("address")})
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long uid;
    @Column(name = "uname")
    private String name;
    @Column(name = "descriptiont")
    private String description;
    private LocalDateTime created;
    private AgeGroup ageGroup;
//以前通过注解的实现方式一  @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
//以前通过注解的实现方式二    @JoinColumn(name = "address_id"即address里面id的一个外键, referencedColumnName = "id")
//现在新的实现方式,只需要使用    @OneToOne
    @OneToOne
    private Address address;

    public Long getUid() {
        return uid;
    }

    public void setUid(Long uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public LocalDateTime getCreated() {
        return created;
    }

    public void setCreated(LocalDateTime created) {
        this.created = created;
    }

    public AgeGroup getAgeGroup() {
        return ageGroup;
    }

    public void setAgeGroup(AgeGroup ageGroup) {
        this.ageGroup = ageGroup;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}

步骤三:去数据库创建关于Adderss的数据表

首先进入DOS界面
输入:mysql -u root -p;
输入:密码

use springdataproject;

show tables;

create table address(
id long auto_increment not null,
country varchar(64) not null,
province varchar(64) not null,
city varchar(64) not null,
detail varchar(256) not null,
primary key(id),
) engine=innodb default charset=utf8mb4:

show tables;

desc userspringdata;

发现address引用变量还没有添加到userspringdata表
如何将address与userspringdata表进行关联?

方法:alter table userspringdata add column address_id long ;

desc userspringdata;

这里userspringdata的address_id就应该是address表的外键,如何添加外键?

alter table userspringdata add constraint user_address foreign key(address_id) references address(id);

此时address表中还没有任何记录,往address表中插入数据

insert into address (country,province,city,detail) values(‘cn’,‘shanghai’,‘shanghai’,‘shaonianchunlu222 buiding 4-301’);

insert into address (country,province,city,detail) values(‘cn’,‘Beijng’,‘Beijng’,‘shaonianchunlu232 buiding 5-101’);

select * from address;

select * from userspringdata;

update table userspringdata set address_id=1 where id=1;

update table userspringdata set address_id=1 where id=1;

update table userspringdata set address_id=1 where name=Terry;

select * from userspringdata;

重启启动类
localhost:8001/user/all

2.@NamedEntityGraph(name=“userentity.all”)通过name来识别,可以定义在UserEntity,但如果定义多个.@NamedEntityGraph,想要指定哪个方法,可以在UserRepository的方法上定义声明

实现方式一:在UserRepository中 @EntityGraph(value = “userentity.all”, type= EntityGraph.EntityGraphType.FETCH)


public interface UserRepository extends JpaRepository<UserEntity, Long>,
        JpaSpecificationExecutor<UserEntity> {
        
    @EntityGraph(value = "userentity.all", type= EntityGraph.EntityGraphType.FETCH)
    public List<UserEntity> findAllByName(String name);
}

实现方式二:在UserRepository中 @EntityGraph(attributePaths = {“address”})


public interface UserRepository extends JpaRepository<UserEntity, Long>,
        JpaSpecificationExecutor<UserEntity> {
        
    @EntityGraph(attributePaths = {"address"})
    public List<UserEntity> findAllByName(String name);
}

重启启动类
localhost:8001/user/findAllByName?name=Terry

【2021年,将Spring全家桶系列课程进行Review,修复顺序等错误。进入2022年,将Spring的课程进行整理,整理为案例精讲的系列课程,并新增高级的Spring Security等内容,通过手把手一步步教你从零开始学会应用Spring,课件将逐步进行上传,敬请期待】 本课程是Spring案例精讲课程的第五部分Spring Data,Spring案例精讲课程以真实场景、项目实战为导向,循序渐进,深入浅出的讲解Java网络编程,助力您在技术工作中更进一步。 本课程聚焦Spring Data的核心知识点:Spring Data Repository、Spring Data JPA(增删改查案例、实体自动生成数据库表、增加新的Repository方法、分页、排序、@NamedQuery、@Query及其分页和排序及参数设置、@NamedEntityGragh实现多对多映射、及QueryHints等)、Spring Data JDBC(增删改查案例、@Query等)的案例介绍, 快速掌握Spring Data的核心知识,快速上手,为学习及工作做好充足的准备。 由于本课程聚焦于案例,即直接上手操作,对于Spring的原理等不会做过多介绍,希望了解原理等内容的需要通过其他视频或者书籍去了解,建议按照该案例课程一步步做下来,之后再去进一步回顾原理,这样能够促进大家对原理有更好的理解。 【通过Spring全家桶,我们保证你能收获到以下几点】 1、掌握Spring全家桶主要部分的开发、实现2、可以使用Spring MVC、Spring Boot、Spring CloudSpring Data进行大部分的Spring开发3、初步了解使用微服务、了解使用Spring进行微服务的设计实现4、奠定扎实的Spring技术,具备了一定的独立开发的能力  【实力讲师】 毕业于清华大学软件学院软件工程专业,曾在Accenture、IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构、设计、开发及管理工作,在电商、零售、制造业等有丰富的项目实施经验  【本课程适用人群】如果你是一定不要错过!  适合于有JavaEE基础的,如:JSP、JSTL、Java基础等的学习者没有基础的学习者跟着课程可以学习,但是需要补充相关基础知识后,才能很好的参与到相关的工作中。 【Spring全家桶课程共包含如下几门】5. 进阶篇:SpringData 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值