FetchMode和FetchType

本文探讨了在Java Hibernate框架中如何解决常见的N+1查询问题,并对比了几种不同的配置方式,包括FetchType.LAZY、FetchType.EAGER以及FetchMode的不同选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:http://www.jianshu.com/p/23bd82a7b96e


Entity:

Entity City and Hotel, One-to-Many 双向连接.

@Entity
public class City {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String country;

    @OneToMany(mappedBy="city")
    private Set<Hotel> hotles;

    ...

}
@Entity
public class Hotel {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(optional = false)
    @NaturalId
    private City city;

    @Column(nullable = false)
    @NaturalId
    private String name;

    @Column(nullable = false)
    private String address;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "hotel")
    private Set<Review> reviews;

    ...

}



Data:

insert into city(country, name) values ('Australia', 'Brisbane')
insert into city(country, name) values ('Canada', 'Montreal')
insert into city(country, name) values ('Australia', 'Melbourne')
insert into city(country, name) values ('Israel', 'Tel Aviv')

insert into hotel(city_id, name, address) values (1, 'Hotel_A', 'Street_A')
insert into hotel(city_id, name, address) values (1, 'Hotel_B', 'Street_A')
insert into hotel(city_id, name, address) values (1, 'Hotel_C', 'Street_C')
insert into hotel(city_id, name, address) values (2, 'Hotel_D', 'Street_D')
insert into hotel(city_id, name, address) values (2, 'Hotel_E', 'Street_E')
insert into hotel(city_id, name, address) values (3, 'Hotel_F', 'Street_F')
insert into hotel(city_id, name, address) values (3, 'Hotel_G', 'Street_G')
insert into hotel(city_id, name, address) values (3, 'Hotel_H', 'Street_H')
insert into hotel(city_id, name, address) values (3, 'Hotel_I', 'Street_I')
insert into hotel(city_id, name, address) values (3, 'Hotel_J', 'Street_J')
insert into hotel(city_id, name, address) values (4, 'Hotel_K', 'Street_K')



Code causes N+1:

criteria.list()发送一条sql获取所有City, 循环执行city.getHotles().size()时发送N条sql获取Hotel

    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();

    Criteria criteria = session.createCriteria(City.class);
    //one sql
    List<City> cityList = criteria.list();
    for(City city : cityList){
        //N sql
        System.out.println(city.getHotles().size());
    }

    transaction.commit();
    session.close();

output:

2017-02-25 12:00:45.630 DEBUG 5460 --- [nio-8080-exec-5] org.hibernate.SQL                        : select this_.id as id1_0_0_, this_.country as country2_0_0_, this_.name as name3_0_0_ from City this_
Hibernate: select this_.id as id1_0_0_, this_.country as country2_0_0_, this_.name as name3_0_0_ from City this_
2017-02-25 12:00:45.632 DEBUG 5460 --- [nio-8080-exec-5] org.hibernate.SQL                        : select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
Hibernate: select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
3
2017-02-25 12:00:45.634 DEBUG 5460 --- [nio-8080-exec-5] org.hibernate.SQL                        : select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
Hibernate: select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
2
2017-02-25 12:00:45.636 DEBUG 5460 --- [nio-8080-exec-5] org.hibernate.SQL                        : select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
Hibernate: select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
5
2017-02-25 12:00:45.638 DEBUG 5460 --- [nio-8080-exec-5] org.hibernate.SQL                        : select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
Hibernate: select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
1



FetchType.LAZY and @Fetch(FetchMode.SELECT):

City中加上fetch=FetchType.LAZY@Fetch(FetchMode.SELECT), 输出结果与上面相同,说明one-to-many默认设置是fetch=FetchType.LAZY@Fetch(FetchMode.SELECT)
下面四种配置等效,都是N+1条sql的懒加载:

@OneToMany(mappedBy="city")
private Set<Hotel> hotles;
@OneToMany(mappedBy="city")
@Fetch(FetchMode.SELECT)
private Set<Hotel> hotles;
@OneToMany(mappedBy="city", fetch=FetchType.LAZY)
private Set<Hotel> hotles;
@OneToMany(mappedBy="city", fetch=FetchType.LAZY)
@Fetch(FetchMode.SELECT)
private Set<Hotel> hotles;



FetchType.Eager and @Fetch(FetchMode.SELECT):

City中加上fetch=FetchType.Eager@Fetch(FetchMode.SELECT)

@OneToMany(mappedBy="city", fetch=FetchType.Eager)
@Fetch(FetchMode.SELECT)
private Set<Hotel> hotles;

output:

2017-02-25 14:13:45.455 DEBUG 5800 --- [nio-8080-exec-1] org.hibernate.SQL                        : select this_.id as id1_0_0_, this_.country as country2_0_0_, this_.name as name3_0_0_ from City this_
Hibernate: select this_.id as id1_0_0_, this_.country as country2_0_0_, this_.name as name3_0_0_ from City this_
2017-02-25 14:13:45.473 DEBUG 5800 --- [nio-8080-exec-1] org.hibernate.SQL                        : select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
Hibernate: select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
2017-02-25 14:13:45.482 DEBUG 5800 --- [nio-8080-exec-1] org.hibernate.SQL                        : select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
Hibernate: select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
2017-02-25 14:13:45.485 DEBUG 5800 --- [nio-8080-exec-1] org.hibernate.SQL                        : select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
Hibernate: select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
2017-02-25 14:13:45.486 DEBUG 5800 --- [nio-8080-exec-1] org.hibernate.SQL                        : select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
Hibernate: select hotles0_.city_id as city_id4_0_0_, hotles0_.id as id1_1_0_, hotles0_.id as id1_1_1_, hotles0_.address as address2_1_1_, hotles0_.city_id as city_id4_1_1_, hotles0_.name as name3_1_1_ from Hotel hotles0_ where hotles0_.city_id=?
3
2
5
1

同样是N+1条sql,不过和上面情况不同的是,N条sql会在criteria.list()时执行


FetchMode.JOIN:

City中加上@Fetch(FetchMode.JOIN), 那么Hibernate将强行设置为fetch=FetchType.EAGER, 用户设置fetch=FetchType.LAZY将不会生效.
下面四种设置等效:

@OneToMany(mappedBy="city", fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
private Set<Hotel> hotles;
@OneToMany(mappedBy="city", fetch=FetchType.LAZY)
@Fetch(FetchMode.JOIN)
private Set<Hotel> hotles;
@OneToMany(mappedBy="city")
@Fetch(FetchMode.JOIN)
private Set<Hotel> hotles;
@OneToMany(mappedBy="city", fetch=FetchType.EAGER)
private Set<Hotel> hotles;

output:

2017-02-25 13:17:07.583 DEBUG 2964 --- [nio-8080-exec-1] org.hibernate.SQL                        : select this_.id as id1_0_1_, this_.country as country2_0_1_, this_.name as name3_0_1_, hotles2_.city_id as city_id4_0_3_, hotles2_.id as id1_1_3_, hotles2_.id as id1_1_0_, hotles2_.address as address2_1_0_, hotles2_.city_id as city_id4_1_0_, hotles2_.name as name3_1_0_ from City this_ left outer join Hotel hotles2_ on this_.id=hotles2_.city_id
Hibernate: select this_.id as id1_0_1_, this_.country as country2_0_1_, this_.name as name3_0_1_, hotles2_.city_id as city_id4_0_3_, hotles2_.id as id1_1_3_, hotles2_.id as id1_1_0_, hotles2_.address as address2_1_0_, hotles2_.city_id as city_id4_1_0_, hotles2_.name as name3_1_0_ from City this_ left outer join Hotel hotles2_ on this_.id=hotles2_.city_id
3
3
3
2
2
5
5
5
5
5
1

从输出可看出,在执行criteria.list()时通过一条sql 获取了所有的City和Hotel。
使用@Fetch(FetchMode.JOIN)需要注意的是:它在Join查询时是Full Join, 所以会有重复City出现


FetchMode.SUBSELECT:

City中加上@Fetch(FetchMode.SUBSELECT), 那么Hibernate将强行设置为fetch=FetchType.EAGER, 用户设置fetch=FetchType.LAZY将不会生效.
下面三种设置等效:

@OneToMany(mappedBy="city", fetch=FetchType.EAGER)
@Fetch(FetchMode.SUBSELECT)
private Set<Hotel> hotles;
@OneToMany(mappedBy="city", fetch=FetchType.LAZY)
@Fetch(FetchMode.SUBSELECT)
private Set<Hotel> hotles;
@OneToMany(mappedBy="city")
@Fetch(FetchMode.SUBSELECT)
private Set<Hotel> hotles;

output:

2017-02-25 13:45:06.089 DEBUG 4004 --- [nio-8080-exec-1] org.hibernate.SQL                        : select this_.id as id1_0_0_, this_.country as country2_0_0_, this_.name as name3_0_0_ from City this_
Hibernate: select this_.id as id1_0_0_, this_.country as country2_0_0_, this_.name as name3_0_0_ from City this_
2017-02-25 13:45:06.114 DEBUG 4004 --- [nio-8080-exec-1] org.hibernate.SQL                        : select hotles0_.city_id as city_id4_0_1_, hotles0_.id as id1_1_1_, hotles0_.id as id1_1_0_, hotles0_.address as address2_1_0_, hotles0_.city_id as city_id4_1_0_, hotles0_.name as name3_1_0_ from Hotel hotles0_ where hotles0_.city_id in (select this_.id from City this_)
Hibernate: select hotles0_.city_id as city_id4_0_1_, hotles0_.id as id1_1_1_, hotles0_.id as id1_1_0_, hotles0_.address as address2_1_0_, hotles0_.city_id as city_id4_1_0_, hotles0_.name as name3_1_0_ from Hotel hotles0_ where hotles0_.city_id in (select this_.id from City this_)
3
2
5
1

从输出可看出,在执行criteria.list()时通过两条sql分别获取City和Hotel。


Summary:

FetchMode\FetchTypeLazyEagerNull
SelectABA
JoinCCC
SubselectDDD
NullACA

十二种排列组合,但最后只会有四种情况,如上标注的A,B,C,D:
A. FetchMode.SELECTFetchType.LAZY,都不设置,都设置,设置任一, 都将会是情况A。情况A会出现N+1条sql,其中N条是懒加载。
B. FetchMode.SELECTFetchType.EAGER同时设置时出现B情况,同样是N+1条sql,和A情况不同的是N条sql会立即执行。
C. 只要设置了FetchMode.JOIN,不管FetchType设置成什么(FetchType.EAGER,FetchType.LAZY,不设置FetchType),都将会是C情况。同时,只设置FetchType.EAGER不设置FetchMode也将会是C情况。C情况下只产生一条立即执行的Full-Join的sql, parent数据可能会重复。
D. 只要设置了FetchMode.SUBSELECT,不管FetchType设置成什么(FetchType.EAGER,FetchType.LAZY,不设置FetchType),都将会是D情况。D情况下产生两条立即执行的sql, 分别读取parent表和child表。



作者:昵称全尼马被注册了
链接:http://www.jianshu.com/p/23bd82a7b96e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

package com.kucun.data.entity; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonManagedReference; /** 板材 @author Administrator */ @Entity @Table(name=“bancai”) public class Bancai { @Id private int id; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = “caizhi_id”) // @JsonManagedReference // 标记为“主”关联方 private Caizhi caizhi; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = “mupi1_id”) private Mupi mupi1; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = “mupi2_id”) private Mupi mupi2; private Double houdu; @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = “kucun_id”, referencedColumnName = “id”) private Kucun kucun; public Kucun getKucun() { return kucun; } public void setKucun(Kucun kucun) { this.kucun = kucun; } public int getId() { return id; } public void setId(int id) { this.id = id; } public Caizhi getCaizhi() { return caizhi; } public void setCaizhi(Caizhi caizhi) { this.caizhi = caizhi; } public Mupi getMupi1() { return mupi1; } public void setMupi1(Mupi mupi1) { this.mupi1 = mupi1; } public Mupi getMupi2() { return mupi2; } public void setMupi2(Mupi mupi2) { this.mupi2 = mupi2; } public Double getHoudu() { return houdu; } public void setHoudu(Double houdu) { this.houdu = houdu; } public Bancai(int id, Caizhi caizhi, Mupi mupi1, Mupi mupi2, Double houdu) { super(); this.id = id; this.caizhi = caizhi; this.mupi1 = mupi1; this.mupi2 = mupi2; this.houdu = houdu; } public Bancai() { super(); } } package com.kucun.data.entity; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** 板材材质 @author Administrator */ @Entity @Table(name=“caizhi”) @JsonIgnoreProperties({“hibernateLazyInitializer”, “handler”}) public class Caizhi { @Id private int id ; private String name; @OneToMany(mappedBy=“caizhi”) @JsonIgnore private List<Bancai> bancais; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return “{id:” + id + “, name:” + name + “}”; } public Caizhi(int id, String name) { super(); this.id = id; this.name = name; } public Caizhi() { super(); } // 添加反向关联维护方法 public void addBancai(Bancai bancai) { bancais.add(bancai); bancai.setCaizhi(this); } // 添加移除方法 public void removeBancai(Bancai bancai) { bancais.remove(bancai); bancai.setCaizhi(null); } } package com.kucun.data.entity; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OneToOne; /** 产品组件关联类 @author Administrator */ @Entity public class Chanpin_zujian { @Id private Integer id; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Chanpin chanpins; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Zujian zujian; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Bancai bancai; private Double one_howmany; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Chanpin getChanpins() { return chanpins; } public void setChanpins(Chanpin chanpins) { this.chanpins = chanpins; } public Zujian getZujian() { return zujian; } public void setZujian(Zujian zujian) { this.zujian = zujian; } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { this.bancai = bancai; } public Double getOne_howmany() { return one_howmany; } public void setOne_howmany(Double one_howmany) { this.one_howmany = one_howmany; } public Chanpin_zujian() { super(); // TODO Auto-generated constructor stub } } package com.kucun.data.entity; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.OneToMany; /** 产品类 @author Administrator */ @Entity public class Chanpin { @Id private Integer id; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Dingdan_chanpin> dingdians; private String bianhao; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Chanpin_zujian> zujians; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public List<Dingdan_chanpin> getDingdians() { return dingdians; } public void setDingdians(List<Dingdan_chanpin> dingdians) { this.dingdians = dingdians; } public String getBianhao() { return bianhao; } public void setBianhao(String bianhao) { this.bianhao = bianhao; } public List<Chanpin_zujian> getZujians() { return zujians; } public void setZujians(List<Chanpin_zujian> zujians) { this.zujians = zujians; } public Chanpin(Integer id, List<Dingdan_chanpin> dingdians, String bianhao, List<Chanpin_zujian> zujians) { super(); this.id = id; this.dingdians = dingdians; this.bianhao = bianhao; this.zujians = zujians; } public Chanpin() { super(); // TODO Auto-generated constructor stub } } package com.kucun.data.entity; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.ManyToOne; /** 一个订单中的产品组件订购板材数量 @author Administrator */ @Entity public class Dingdan_chanpin_zujian { @Id private Integer id; //订单 @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Dingdan dingdan; //板材 @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Bancai bancai; //产品组件 @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Chanpin_zujian zujians; //订购数 private Integer shuliang ; public Dingdan_chanpin_zujian() { super(); // TODO Auto-generated constructor stub } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Dingdan getDingdan() { return dingdan; } public void setDingdan(Dingdan dingdan) { this.dingdan = dingdan; } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { this.bancai = bancai; } public Chanpin_zujian getZujians() { return zujians; } public void setZujians(Chanpin_zujian zujians) { this.zujians = zujians; } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { this.shuliang = shuliang; } } package com.kucun.data.entity; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.ManyToOne; /** 订单产品关联 @author Administrator */ @Entity public class Dingdan_chanpin { @Id private Integer id; //产品信息 @ManyToOne (cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Dingdan dingdan; //产品数量 @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Chanpin chanpin; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Dingdan getDingdan() { return dingdan; } public void setDingdan(Dingdan dingdan) { this.dingdan = dingdan; } public Chanpin getChanping() { return chanpin; } public void setChanping(Chanpin chanping) { this.chanpin = chanping; } } package com.kucun.data.entity; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.OneToMany; /** 订单 @author Administrator */ @Entity public class Dingdan { @Id private Integer id; //订单号 private String number; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Dingdan_chanpin> dingdan_chanpins; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Dingdan_chanpin_zujian> dingdan_chanpins_zujians; @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Chanpin> chanpins; public List<Dingdan_chanpin_zujian> getDingdan_chanpins_zujians() { return dingdan_chanpins_zujians; } public void setDingdan_chanpins_zujians(List<Dingdan_chanpin_zujian> dingdan_chanpins_zujians) { this.dingdan_chanpins_zujians = dingdan_chanpins_zujians; } public List<Chanpin> getChanpins() { return chanpins; } public void setChanpins(List<Chanpin> chanpins) { this.chanpins = chanpins; } public List<Dingdan_chanpin> getDingdan_chanpins() { return dingdan_chanpins; } public void setDingdan_chanpins(List<Dingdan_chanpin> dingdan_chanpins) { this.dingdan_chanpins = dingdan_chanpins; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Dingdan(Integer id, String number) { super(); this.id = id; this.number = number; } public Dingdan() { super(); // TODO Auto-generated constructor stub } } package com.kucun.data.entity; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; /** 通信类 @author Administrator */ public class Information { private static final ObjectMapper mapper = new ObjectMapper(); private Integer Status ; private String text; private Object data; public Integer getStatus() { return Status; } public void setStatus(Integer status) { Status = status; } public String getText() { return text; } public void setText(String text) { this.text = text; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public Information(Integer status, String text, Object data) { super(); Status = status; this.text = text; this.data = data; } @SuppressWarnings({“unchecked”,“rawtypes”}) public Information(Integer status, String text, String data, Class T) throws Exception { super(); Status = status; this.text = text; this.data = fromJson(data,T); } public Information() { super(); // TODO Auto-generated constructor stub } public String DataJson() throws JsonProcessingException { // Java对象转JSON return mapper.writeValueAsString(this); } @SuppressWarnings(“unchecked”) public <T> T fromJson(String json, Class<T> clazz) throws Exception { data= mapper.readValue(json, clazz); return (T) data; } public static Information NewSuccess(Object data) { return new Information(200, “success”, data); } public static Information NewSuccess(String data) { return new Information(200, “success”, data); } public static Information Newfail(Integer status,String text,Object data) { return new Information(status, “success”, data); } } package com.kucun.data.entity; import java.util.Date; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Jinhuo { @Id private Integer id; private Dingdan dingdan; private Chanpin chanpin; private Zujian zujian; private Bancai bancai; private Integer shuliang; private Date date; private User user; public Jinhuo(Integer id, Dingdan dingdan, Chanpin chanpin, Zujian zujian, Bancai bancai, Integer shuliang, Date date, User user) { super(); this.id = id; this.dingdan = dingdan; this.chanpin = chanpin; this.zujian = zujian; this.bancai = bancai; this.shuliang = shuliang; this.date = date; this.user = user; } public Jinhuo() { super(); // TODO Auto-generated constructor stub } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Dingdan getDingdan() { return dingdan; } public void setDingdan(Dingdan dingdan) { this.dingdan = dingdan; } public Chanpin getChanpin() { return chanpin; } public void setChanpin(Chanpin chanpin) { this.chanpin = chanpin; } public Zujian getZujian() { return zujian; } public void setZujian(Zujian zujian) { this.zujian = zujian; } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { this.bancai = bancai; } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { this.shuliang = shuliang; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } package com.kucun.data.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; /** 库存 @author Administrator */ @Entity public class Kucun { @Id private Integer id; private Long shuliang; @OneToOne(fetch = FetchType.LAZY) // 正确映射 Bancai 实体 @JoinColumn(name = “bancai_id”, referencedColumnName = “id”) private Bancai bancai; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { this.bancai = bancai; } public Long getShuliang() { return shuliang; } public void setShuliang(Long shuliang) { this.shuliang = shuliang; } public Kucun(Integer id, Bancai bancai, Long shuliang) { super(); this.id = id; this.bancai = bancai; this.shuliang = shuliang; } public Kucun() { super(); // TODO Auto-generated constructor stub } } package com.kucun.data.entity; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** 木皮 @author Administrator */ @Entity @Table(name=“mupi”) @JsonIgnoreProperties({“hibernateLazyInitializer”, “handler”}) public class Mupi { @Id private int id; private String name; /** 是否有油漆 */ private Boolean you; // 添加 OneToMany 映射 @OneToMany(mappedBy = “mupi1”) // 指向 Bancai 中的 mupi1 字段 @JsonIgnore private List<Bancai> bancaisForMupi1; @OneToMany(mappedBy = “mupi2”) // 指向 Bancai 中的 mupi2 字段 @JsonIgnore private List<Bancai> bancaisForMupi2; public Mupi(int id, String name, List<Bancai> bancaisForMupi1, List<Bancai> bancaisForMupi2) { super(); this.id = id; this.name = name; this.bancaisForMupi1 = bancaisForMupi1; this.bancaisForMupi2 = bancaisForMupi2; } public List<Bancai> getBancaisForMupi1() { return bancaisForMupi1; } public void setBancaisForMupi1(List<Bancai> bancaisForMupi1) { this.bancaisForMupi1 = bancaisForMupi1; } public List<Bancai> getBancaisForMupi2() { return bancaisForMupi2; } public void setBancaisForMupi2(List<Bancai> bancaisForMupi2) { this.bancaisForMupi2 = bancaisForMupi2; } @Override public String toString() { return “{id:” + id + “, name:” + name + “}”; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Mupi(int id, String name) { super(); this.id = id; this.name = name; } public Mupi() { super(); } public Boolean getYou() { return you; } public void setYou(Boolean you) { this.you = you; } } package com.kucun.data.entity; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entity public class Zujian { @Id private Integer id; private String name; @ManyToOne private Chanpin_zujian chanpin; public Chanpin_zujian getChanpin() { return chanpin; } public void setChanpin(Chanpin_zujian chanpin) { this.chanpin = chanpin; } public Zujian() { super(); // TODO Auto-generated constructor stub } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public interface DingdanRepository extends JpaRepository<Dingdan, Integer> { 实现api能通过参数搜索符合条件的订单 产品 组件 板材库存的大部分信息的数据,参数为产品的bianhao ,返回是订单集合,该集合只有这个产品相关信息 ,其他产品清空,返回数据结构不变属性名不变 属性可以null }
最新发布
06-06
package com.kucun.data.entity; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonManagedReference; /** 板材 @author Administrator */ @Entity @Table(name=“bancai”) public class Bancai { @Id private int id; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = “caizhi_id”) // @JsonManagedReference // 标记为“主”关联方 private Caizhi caizhi; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JsonBackReference @JoinColumn(name = “mupi1_id”) private Mupi mupi1; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = “mupi2_id”) @JsonBackReference private Mupi mupi2; private Double houdu; public int getId() { return id; } public void setId(int id) { this.id = id; } public Caizhi getCaizhi() { return caizhi; } public void setCaizhi(Caizhi caizhi) { this.caizhi = caizhi; } public Mupi getMupi1() { return mupi1; } public void setMupi1(Mupi mupi1) { this.mupi1 = mupi1; } public Mupi getMupi2() { return mupi2; } public void setMupi2(Mupi mupi2) { this.mupi2 = mupi2; } public Double getHoudu() { return houdu; } public void setHoudu(Double houdu) { this.houdu = houdu; } @Override public String toString() { return “{id:” + id + “, caizhi:” + caizhi + “, mupi1:” + mupi1 + “, mupi2:” + mupi2 + “, houdu:” + houdu + “}”; } public Bancai(int id, Caizhi caizhi, Mupi mupi1, Mupi mupi2, Double houdu) { super(); this.id = id; this.caizhi = caizhi; this.mupi1 = mupi1; this.mupi2 = mupi2; this.houdu = houdu; } public Bancai() { super(); } } package com.kucun.data.entity; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** 板材材质 @author Administrator */ @Entity @Table(name=“caizhi”) @JsonIgnoreProperties({“hibernateLazyInitializer”, “handler”}) public class Caizhi { @Id private int id ; private String name; @OneToMany(mappedBy=“caizhi”) private List<Bancai> bancais; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return “{id:” + id + “, name:” + name + “}”; } public Caizhi(int id, String name) { super(); this.id = id; this.name = name; } public Caizhi() { super(); } // 添加反向关联维护方法 public void addBancai(Bancai bancai) { bancais.add(bancai); bancai.setCaizhi(this); } // 添加移除方法 public void removeBancai(Bancai bancai) { bancais.remove(bancai); bancai.setCaizhi(null); } } package com.kucun.data.entity; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** 木皮 @author Administrator */ @Entity @Table(name=“mupi”) @JsonIgnoreProperties({“hibernateLazyInitializer”, “handler”}) public class Mupi { @Id private int id; private String name; // 添加 OneToMany 映射 @OneToMany(mappedBy = "mupi1") // 指向 Bancai 中的 mupi1 字段 private List<Bancai> bancaisForMupi1; @OneToMany(mappedBy = "mupi2") // 指向 Bancai 中的 mupi2 字段 private List<Bancai> bancaisForMupi2; public Mupi(int id, String name, List<Bancai> bancaisForMupi1, List<Bancai> bancaisForMupi2) { super(); this.id = id; this.name = name; this.bancaisForMupi1 = bancaisForMupi1; this.bancaisForMupi2 = bancaisForMupi2; } public List<Bancai> getBancaisForMupi1() { return bancaisForMupi1; } public void setBancaisForMupi1(List<Bancai> bancaisForMupi1) { this.bancaisForMupi1 = bancaisForMupi1; } public List<Bancai> getBancaisForMupi2() { return bancaisForMupi2; } public void setBancaisForMupi2(List<Bancai> bancaisForMupi2) { this.bancaisForMupi2 = bancaisForMupi2; } @Override public String toString() { return "{id:" + id + ", name:" + name + "}"; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Mupi(int id, String name) { super(); this.id = id; this.name = name; } public Mupi() { super(); } } 如何在程序中决定是否连级查找并只查找一级 ,关联的集合中的实体不会再查询它内部的集合,
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值