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