javax.persistence 注释注解

本文详细介绍了JPA注解在持久化类中的使用方法,包括@Entity、@Table、@Id、@GeneratedValue、@Column等常用注解的功能与用法,并针对可能出现的错误提供了解决方案,如'cannotsimultaneouslyfetchmultiplebags'错误的避免方法。

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

JPA注解持久化类很方便,需要jar包:ejb3-persistence.jar。我用以下三个类来说明用法。 

Java代码  
  1. @SuppressWarnings("serial")  
  2. @Entity  
  3. @Table(name="T_X")  
  4. public class X implements Serializable  
  5. {  
  6.     @Id  
  7.     @GeneratedValue(strategy = GenerationType.AUTO)  
  8.     private int id;  
  9.   
  10.     @Column(length=32)  
  11.     private String name;  
  12.       
  13.          @Transient   //表示此数据不在数据库表里建立属性  
  14.          private String temp;  
  15.   
  16.     @Temporal(TemporalType.TIMESTAMP) //这个是带时分秒的类型  
  17.     private Date date;  
  18.   
  19.     @OneToOne(cascade = CascadeType.ALL, mappedBy = "x")  
  20.     private A a;  
  21. }  
  22. @SuppressWarnings("serial")  
  23. @Entity  
  24. @Table(name="T_A")  
  25. public class A implements Serializable  
  26. {  
  27.     @Id  
  28.     @GeneratedValue(strategy = GenerationType.AUTO)  
  29.     private int id;  
  30.   
  31.     @OneToMany(cascade = CascadeType.ALL, mappedBy = "a", fetch = FetchType.EAGER)  
  32.     private List<B> b = new ArrayList<B>();  
  33.   
  34.     @OneToOne()  
  35.     @JoinColumn(name = "x_Id"//加这句后就会双方共同维护关系  
  36.     private X x;  
  37. }  
  38.   
  39. @SuppressWarnings("serial")  
  40. @Entity  
  41. public class B implements Serializable{  
  42.          @Id  
  43.     @GeneratedValue(strategy = GenerationType.AUTO)  
  44.     protected int id;  
  45.   
  46.     @ManyToOne()  
  47.     @JoinColumn(name = "a_id")  
  48.     protected A a;  
  49. }  

要注意的是:fetch = FetchType.EAGER这句话在一个类里面只能出现一次,出现两次就会报错“cannot simultaneously fetch multiple bags”,要把其他的改为fetch = FetchType.LAZY延迟加载就可以了。听说把List集合改为Set也能解决这个错误。 

其他要点: 
1、@Table(name="T_X")这句话可以不写,不写就已类名作为表名 

2、如果想让两个类的属性生成一个数据表,在一个类里这样加入另一个类即可: @Embedded 
private C c; 

3、如果想要一个类继承另一个类的所有属性,则在父类里这样写: 
@SuppressWarnings("serial") 
@Entity 
@MappedSuperclass   //增加这一行 
并把父类的所有属性的private改为protected即可 

4、建议在一对多关联中在"一"方用延迟加载"多"方可以在HQL中显式的"迫切左外连接" left join fetch 这样做Hibernate可以少访问数据库,也可以用"@BatchSize(size = 5)"来减少访问数据库的次数 


1. @Id 声明属性为主键 


2. @GeneratedValue表示主键是自动生成策略,一般该注释和 @Id 一起使用 


3. @Entity 任何 hibernte 映射对象都要有次注释 


4. @Table(name = “tablename”) 类声明此对象映射到哪个表 


5. @Column(name = “Name”,nullable=false,length=32) 声明数据 库字段和类属性对应关系 


6. @Lob 声明字段为 Clob 或 Blob 类型 



7. @OneToMany(mappedBy=”order”,cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
   @OrderBy(value = “id ASC”) 
   一对多声明,和 ORM 产品声明类似,一看就明白了。 
   @ManyToOne(cascade=CascadeType.REFRESH,optional=false) 
   @JoinColumn(name = “order_id”) 
   声明为双向关联 


8. @Temporal(value=TemporalType.DATE) 做日期类型转换。 



9. @OneToOne(optional= true,cascade = CascadeType.ALL, mappedBy = “person”) 
   一对一关联声明 
   @OneToOne(optional = false, cascade = CascadeType.REFRESH) 
   @JoinColumn(name = “Person_ID”, referencedColumnName = “personid”,unique = true) 
   声明为双向关联 



10. @ManyToMany(mappedBy= “students”) 
   多对多关联声明。 
  @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) 
  @JoinTable(name = “Teacher_Student”, 
    joinColumns = {@JoinColumn(name = “Teacher_ID”, referencedColumnName = “teacherid”)}, 
    inverseJoinColumns = {@JoinColumn(name = “Student_ID”, referencedColumnName = 
    “studentid”)}) 
   多对多关联一般都有个关联表,是这样声明的! 



11. @Transiten表示此属性与表没有映射关系,是一个暂时的属性 



12. @Cache(usage= CacheConcurrencyStrategy.READ_WRITE)表示此对象应用缓存 


JPA规范 
@Entity:通过@Entity注解将一个类声明为一个实体bean 

@Table:通过 @Table注解可以为实体bean映射指定表,name属性表示实体所对应表的名称,如果没有定义 @Table,那么系统自动使用默认值:实体的类名(不带包名) 

@Id:用于标记属性的主键 

@Column:表示持久化属性所映射表中的字段,如果属性名与表中的字段名相同,则可以省略@Column注解,另外有两种方式标记,一是放在属性前,另一种是放在getter方法前,例如: 

@Column(name = "EMPLOYEE_NAME") 

private String employee_name; 或者 

@Column(name = "EMPLOYEE_NAME") 

public String getEmployee_name() { 

return employee_name; 

} 这两种方式都是正解的,根据个人喜好来选择。大象偏向于第二种,并且喜欢将属性名与字段名设成一样的,这样可以省掉@Column注解,使代码更简洁。 



@Temporal(TemporalType.DATE):如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型,如④所示。在javax.persistence.TemporalType枚举中定义了3种时间类型: 

通过 @Temporal 定义映射到数据库的时间精度: 
@Temporal(TemporalType.DATE)       日期 
@Temporal(TemporalType.TIME)       时间 
@Temporal(TemporalType.TIMESTAMP) 两者兼具 

                  

@Temporal只是起映射作为 



@Transient   

@Target({METHOD, FIELD}) @Retention(RUNTIME) 

public @interface Transient {} 

指明一个属性或方法不能持久化 





@TableGenerator:表生成器,将当前主键的值单独保存到一个数据库表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式是很常用的。这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题。大象推荐这种方式管理主键,很方便,集中式管理表的主键,而且更换数据库不会造成很大的问题。各属性含义如下: 

        name:表示该表主键生成策略的名称,这个名字可以自定义,它被引用在@GeneratedValue中设置的"generator"值中 

        table:表示表生成策略所持久化的表名,说简单点就是一个管理其它表主键的表,本例中,这个表名为GENERATOR_TABLE 

        pkColumnName:表生成器中的列名,用来存放其它表的主键键名,这个列名是与表中的字段对应的 

        pkColumnValue:实体表所对应到生成器表中的主键名,这个键名是可以自定义滴 

        valueColumnName:表生成器中的列名,实体表主键的下一个值,假设EMPLOYEE表中的EMPLOYEE_ID最大为2,那么此时,生成器表中与实体表主键对应的键名值则为3 

        allocationSize:表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50 

              

              

@Target({METHOD, FIELD}) @Retention(RUNTIME) 

public @interface OneToMany { 

String targetEntity() default ""; 

CascadeType[] cascade() default {}; 

FetchType fetch() default LAZY; 

String mappedBy() default ""; 



String targetEntity (Optional) The fully qualified class name of 

the entity class that is the target of the association. 

Optional only if the Collection property 

is defined using Java generics. Must be 

specified otherwise. 

The parameter type of the 

Collection when defined 

using generics(Generics泛型),    如果使用泛型,就可省略指明targetEntity 

CascadeType[] cascade (Optional) The operations that should be cascaded 

to the target of the association 

No operations are cascaded 

FetchType fetch (Optional) Whether the association should be 

lazy loaded or eagerly fetched. 

FetchType.LAZY    默认为延迟加载 

String mappedBy (Optional) The field that owns the relationship 

指多的一方关联的属性名 

mappedBy指定的是不需要维护关系的一端  ?? 



@Target({METHOD, FIELD}) @Retention(RUNTIME) 

public @interface ManyToOne { 

String targetEntity() default ""; 

CascadeType[] cascade() default {}; 

FetchType fetch() default EAGER; 

boolean optional() default true; 



targetEntity (Optional) The fully qualified class name of the entity class that is the target of the associationThe type of the property that stores the association 

是指一方的实体类型的class  ,默认的就是这个属性的类型。其实有些可以省略掉 



CascadeType[] cascade (Optional) The operations that should be cascaded 

to the target of the association No operations are cascaded 

FetchType fetch (Optional) Whether the association should be 

lazy loaded or eagerly fetched.      FetchType.EAGER   默认为主动加载 

boolean optional (Optional) Whether the association is optional. 

If set to false then a non-null relationship must  always exist. 

true 

@Target({METHOD, FIELD}) @Retention(RUNTIME) 
public @interface OneToOne { 
String targetEntity() default ""; 
CascadeType[] cascade() default {}; 
FetchType fetch() default EAGER; 
boolean optional() default true; 
String mappedBy() default ""; 
boolean usePKasFK() default false; 


The JoinColumn annotation is used to specify a mapped column for joining an entity association or a 
secondary table. 
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) 
public @interface JoinColumn { 
String name() default ""; 
String referencedColumnName() default ""; 
boolean primaryKey() default false; 
boolean unique() default false; 
boolean nullable() default true; 
boolean insertable() default true; 
boolean updatable() default true; 
String columnDefinition() default ""; 
String secondaryTable() default ""; 



@Target({METHOD, FIELD}) @Retention(RUNTIME) 

public @interface ManyToMany { 

String targetEntity() default ""; 

CascadeType[] cascade() default {}; 

FetchType fetch() default LAZY; 

String mappedBy() default ""; 

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; import javax.persistence.Table; import javax.persistence.UniqueConstraint; /** * 订单 * @author Administrator * */ @Entity @Table(name="dingdan", uniqueConstraints = { @UniqueConstraint(columnNames = "number") }) public class Dingdan { @Id private Integer id; //订单号 private String number; @OneToMany( mappedBy = "dingdan", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true ) private List<Dingdan_chanpin> dingdan_chanpins; // 优化订单与订单组件关联 @OneToMany( mappedBy = "dingdan", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true ) private List<Dingdan_chanpin_zujian> dingdan_chanpins_zujians; 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 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.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.UniqueConstraint; /** * 产品类 * @author Administrator * */ @Entity @Table(name="chanpin", uniqueConstraints = { @UniqueConstraint(columnNames = "bianhao") }) public class Chanpin { @Id private Integer id; // 关联订单产品 @OneToMany( mappedBy = "chanpin", cascade = CascadeType.ALL, fetch = FetchType.LAZY ) private List<Dingdan_chanpin> dingdans; private String bianhao; @OneToMany( mappedBy = "chanpin", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true ) private List<Chanpin_zujian> zujians; // 添加/移除组件的辅助方法 public void addZujian(Chanpin_zujian zujian) { zujians.add(zujian); zujian.setChanpin(this); } public void removeZujian(Chanpin_zujian zujian) { zujians.remove(zujian); zujian.setChanpin(null); } // 添加/移除组件的辅助方法 public void addDingdan(Dingdan_chanpin dingdan) { dingdans.add(dingdan); dingdan.setChanpin(this); } public void removeDingdan(Dingdan_chanpin dingdian) { dingdans.remove(dingdian); dingdian.setChanpin(null); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public List<Dingdan_chanpin> getDingdans() { return dingdans; } public void setDingdans(List<Dingdan_chanpin> dingdans) { this.dingdans = dingdans; } 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.dingdans = 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.JoinColumn; import javax.persistence.ManyToOne; /** * 一个订单中的产品组件订购板材数量 * @author Administrator * */ @Entity public class Dingdan_chanpin_zujian { @Id private Integer id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "dingdan_id") // 指定外键列 private Dingdan dingdan; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chanpin_zujian_id") // 指定外键列 private Chanpin_zujian zujian; // 修改为单数形式 //板材 @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "bancai_id") private Bancai bancai; //订购数 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 getZujian() { return zujian; } public void setZujian(Chanpin_zujian zujian) { this.zujian = zujian; } 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.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; /** * 订单和产品关联 * @author Administrator * */ @Entity @Table(name="dingdan_chanpin") public class Dingdan_chanpin { @Id private Integer id; //产品信息 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "dingdai_id") // 指 private Dingdan dingdan; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chanpin_id") // 指 private Chanpin chanpin; private Integer shuliang;//产品数量; public Chanpin getChanpin() { return chanpin; } public void setChanpin(Chanpin chanpin) { this.chanpin = chanpin; } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { this.shuliang = shuliang; } 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; } } 关联编写,现在多出3个只有两个字段的表
06-08
/* 文件路径: entity/Bancai.java */ package com.kucun.data.entity; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.Table; import com.kucun.data.entity.DTO.*; import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * 板材 * @author Administrator * */ @Entity @Table(name="bancai") @JsonSerialize(using = FullEntitySerializer.class) @UniqueEntity( repositoryName = "bancai", fields = {"houdu", "caizhi", "mupi1", "mupi2"}, message = "板材组合已存在" ) public class Bancai extends EntityBasis { @ManyToOne( fetch = FetchType.LAZY) @JoinColumn(name = "caizhi_id") // private Caizhi caizhi; @ManyToOne( fetch = FetchType.LAZY) @JoinColumn(name = "mupi1_id") private Mupi mupi1; @ManyToOne( fetch = FetchType.LAZY) @JoinColumn(name = "mupi2_id") private Mupi mupi2; private Double houdu; @OneToOne( cascade = CascadeType.ALL, orphanRemoval = true, // 添加此配置 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 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(Integer id, Caizhi caizhi, Mupi mupi1, Mupi mupi2, Double houdu) { super( id); this.caizhi = caizhi; this.mupi1 = mupi1; this.mupi2 = mupi2; this.houdu = houdu; } public Bancai() { super(); } } ================================================================================ /* 文件路径: entity/Caizhi.java */ 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 javax.persistence.UniqueConstraint; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.FullEntitySerializer; import com.kucun.data.entity.DTO.UniqueEntity; /** * 板材材质 * @author Administrator * */ @Entity @Table(name="caizhi", uniqueConstraints = { @UniqueConstraint(columnNames = "name") }) @UniqueEntity( repositoryName = "caizhi", fields = {"name"}, message = "材质已存在" ) @JsonSerialize(using = FullEntitySerializer.class) public class Caizhi extends EntityBasis{ @OneToMany(mappedBy="caizhi") private List<Bancai> bancai; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Bancai> getBancai() { return bancai; } public void setBancai(List<Bancai> bancai) { this.bancai = bancai; } } ================================================================================ /* 文件路径: entity/Chanpin_zujian.java */ package com.kucun.data.entity; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.FullEntitySerializer; import com.kucun.data.entity.DTO.UniqueEntity; /** * 产品组件关联类 * @author Administrator * */ @Entity @Table(name="chanpin_zujian") @JsonSerialize(using = FullEntitySerializer.class) @UniqueEntity( repositoryName = "chanpin_zhujian", fields = { "chanpin", "zujian"}, message = "产品下也有该组件" ) public class Chanpin_zujian extends EntityBasis { // 关联到产品 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chanpin_id") private Chanpin chanpin; // 关联到组件 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "zujian_id") private Zujian zujian; // 关联到板材 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "bancai_id") private Bancai bancai; //一张板材生产多少组件 private Double one_howmany; //生产多少组件 private Double zujianshu; public Double getZujianshu() { return zujianshu; } public void setZujianshu(Double zujianshu) { this.zujianshu = zujianshu; } 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 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 } } ================================================================================ /* 文件路径: entity/Chanpin.java */ package com.kucun.data.entity; import java.util.ArrayList; 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.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.*; /** * 产品类 * @author Administrator * */ @Entity @Table(name="chanpin", uniqueConstraints = { @UniqueConstraint(columnNames = "bianhao") }) @JsonSerialize(using = FullEntitySerializer.class) @UniqueEntity( repositoryName = "chanpin", fields = {"bianhao"}, message = "该产品已存在" ) public class Chanpin extends EntityBasis { // 关联订单产品 @OneToMany( mappedBy = "chanpin", cascade = CascadeType.ALL, fetch = FetchType.LAZY ) private List<Dingdan_chanpin> dingdan_chanpin=new ArrayList<>(); private String bianhao; @OneToMany( mappedBy = "chanpin", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true ) private List<Chanpin_zujian> chanpin_zujian; public String getBianhao() { return bianhao; } public void setBianhao(String bianhao) { this.bianhao = bianhao; } public List<Dingdan_chanpin> getDingdan_chanpin() { return dingdan_chanpin; } public void setDingdan_chanpin(List<Dingdan_chanpin> dingdan_chanpin) { this.dingdan_chanpin = dingdan_chanpin; } public List<Chanpin_zujian> getChanpin_zujian() { return chanpin_zujian; } public void setChanpin_zujian(List<Chanpin_zujian> chanpin_zujian) { this.chanpin_zujian = chanpin_zujian; } } ================================================================================ /* 文件路径: entity/Dingdan_bancai.java */ package com.kucun.data.entity; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.Transient; import com.fasterxml.jackson.annotation.JsonIgnore; import com.kucun.data.entity.DTO.UniqueEntity; /** * 订单订购记录, * @author Administrator * */ @Entity @Table(name="dingdan_bancai") @UniqueEntity( repositoryName = "dingdan_chanpin", fields = {"dingdan","chanpin","zujian","bancai"}, message = "订单下已有该产品" ) public class Dingdan_bancai extends EntityBasis{ //订单 @ManyToOne(optional=true) private Dingdan dingdan; //产品 @ManyToOne(optional=true) private Chanpin chanpin; //组件 @ManyToOne(optional=true) private Zujian zujian; //板材 @ManyToOne private Bancai bancai; private Integer shuliang; // 新增 transient 字段(不参与数据库存储) @Transient @JsonIgnore // 不参与序列化 private Integer currentUserId; // Getter 和 Setter public Integer getCurrentUserId() { return currentUserId; } public void setCurrentUserId(Integer currentUserId) { this.currentUserId = currentUserId; } 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; } } ================================================================================ /* 文件路径: entity/Dingdan_chanpin.java */ package com.kucun.data.entity; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.FullEntitySerializer; import com.kucun.data.entity.DTO.UniqueEntity; /** * 订单和产品关联 * @author Administrator * */ @Entity @Table(name="dingdan_chanpin") @UniqueEntity( repositoryName = "dingdan_chanpin", fields = {"dingdan","chanpin"}, message = "订单下已有该产品" ) @JsonSerialize(using = FullEntitySerializer.class) public class Dingdan_chanpin extends EntityBasis { //产品信息 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "dingdan_id") // 指 private Dingdan dingdan; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chanpin_id") // 指 private Chanpin chanpin; private Integer shuliang;//产品数量; public Chanpin getChanpin() { return chanpin; } public void setChanpin(Chanpin chanpin) { this.chanpin = chanpin; } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { this.shuliang = shuliang; } 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; } } ================================================================================ /* 文件路径: entity/Dingdan.java */ package com.kucun.data.entity; import java.util.ArrayList; import java.util.Date; 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.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.FullEntitySerializer; import com.kucun.data.entity.DTO.UniqueEntity; /** * 订单 * @author Administrator * */ @Entity @Table(name="dingdan", uniqueConstraints = { @UniqueConstraint(columnNames = "number") }) @UniqueEntity( repositoryName = "dingdan", fields = {"numder"}, message = "该订单已存在" ) @JsonSerialize(using = FullEntitySerializer.class) public class Dingdan extends EntityBasis{ //订单号 private String number; private Date xiadan; private Date jiaohuo; @OneToMany( mappedBy = "dingdan", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true ) private List<Dingdan_chanpin> dingdan_chanpin=new ArrayList<>(); public Date getXiadan() { return xiadan; } public void setXiadan(Date xiadan) { this.xiadan = xiadan; } public Date getJiaohuo() { return jiaohuo; } public void setJiaohuo(Date jiaohuo) { this.jiaohuo = jiaohuo; } public List<Dingdan_chanpin> getDingdan_chanpin() { return dingdan_chanpin; } public void setDingdan_chanpin(List<Dingdan_chanpin> dingdan_chanpins) { this.dingdan_chanpin = dingdan_chanpins; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Dingdan(Integer id, String number) { super(id); this.number = number; } public Dingdan() { super(); // TODO Auto-generated constructor stub } } ================================================================================ /* 文件路径: entity/EntityBasis.java */ package com.kucun.data.entity; import java.util.Date; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuperclass; import javax.persistence.PrePersist; import javax.persistence.PreRemove; import javax.persistence.PreUpdate; import javax.persistence.Temporal; import javax.persistence.TemporalType; import org.hibernate.annotations.Type; import org.hibernate.annotations.Where; @MappedSuperclass @Where(clause = "deleted = 0") // 添加全局过滤条件 public abstract class EntityBasis implements EntityBasisId { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "last_updated", nullable = false, columnDefinition = "DATETIME DEFAULT CURRENT_TIMESTAMP") @Temporal(TemporalType.TIMESTAMP) private Date lastUpdated = new Date(); @Column(name = "deleted", columnDefinition = "BOOLEAN DEFAULT FALSE") @Type(type = "org.hibernate.type.BooleanType") private Boolean deleted = false; @Column(name = "deleted_at") @Temporal(TemporalType.TIMESTAMP) private Date deletedAt; // Getters and Setters... public Boolean getDeleted() { return deleted; } public void setDeleted(Boolean deleted) { this.deleted = deleted; } public Date getDeletedAt() { return deletedAt; } public void setDeletedAt(Date deletedAt) { this.deletedAt = deletedAt; } // 更新回调方法 @PreRemove private void markAsDeleted() { this.deleted = true; this.deletedAt = new Date(); } // 自动更新时间戳的回调方法 @PrePersist @PreUpdate private void updateTimestamp() { this.lastUpdated = new Date(); } // Getters and Setters... public Date getLastUpdated() { return lastUpdated; } public void setLastUpdated(Date lastUpdated) { this.lastUpdated = lastUpdated; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public EntityBasis(Integer id) { super(); this.id = id; } public EntityBasis() { super(); // TODO Auto-generated constructor stub } } ================================================================================ /* 文件路径: entity/EntityBasisId.java */ package com.kucun.data.entity; public interface EntityBasisId { Integer getId(); void setId(Integer id); } ================================================================================ /* 文件路径: entity/DTO/EntityBasisSerializer.java */ package com.kucun.data.entity.DTO; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; import com.fasterxml.jackson.databind.ser.BeanSerializer; import com.fasterxml.jackson.databind.ser.BeanSerializerBuilder; import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; import com.kucun.data.entity.EntityBasis; import java.io.IOException; import java.lang.reflect.Field; import java.util.Collection; import java.util.Date; import java.util.List; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; // 1. 创建自定义序列化器 public class EntityBasisSerializer extends JsonSerializer<EntityBasis> { @Override public void serialize(EntityBasis entity, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeStartObject(); gen.writeNumberField("id", entity.getId()); Field[] fields = entity.getClass().getDeclaredFields(); for (Field field : fields) { // 跳过已手动处理的id字段 if ("id".equals(field.getName())) continue; field.setAccessible(true); Object value = null; try { value = field.get(entity); } catch (IllegalArgumentException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 仅处理非null值 if (value != null) { // 处理关联实体(已使用@JsonSerialize的字段除外) if (value instanceof EntityBasis) { // 检查字段是否有特殊序列化注解 JsonSerialize serializeAnno = field.getAnnotation(JsonSerialize.class); if (serializeAnno == null) { gen.writeObjectFieldStart(field.getName()); gen.writeNumberField("id", ((EntityBasis) value).getId()); gen.writeEndObject(); } else { // 使用字段自带的序列化器 provider.defaultSerializeField(field.getName(), value, gen); } } // 处理集合类型 else if (value instanceof Collection) { gen.writeArrayFieldStart(field.getName()); for (Object item : (Collection<?>) value) { if (item instanceof EntityBasis) { gen.writeStartObject(); gen.writeNumberField("id", ((EntityBasis) item).getId()); gen.writeEndObject(); } } gen.writeEndArray(); } // 处理基本类型 else if (isSimpleType(field.getType())) { gen.writeObjectField(field.getName(), value); } } } gen.writeEndObject(); } private boolean isSimpleType(Class<?> type) { return type.isPrimitive() || type == String.class || Number.class.isAssignableFrom(type) || type == Boolean.class || type == Date.class; } } ================================================================================ /* 文件路径: entity/DTO/FullEntitySerializer.java */ package com.kucun.data.entity.DTO; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.kucun.data.entity.EntityBasis; import org.hibernate.proxy.HibernateProxy; import org.hibernate.proxy.LazyInitializer; import java.io.IOException; import java.lang.reflect.Field; import java.util.List; import java.util.Map; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; public class FullEntitySerializer extends JsonSerializer { // 解包Hibernate代理对象 private Object unproxy(Object value) { if (value instanceof HibernateProxy) { LazyInitializer initializer = ((HibernateProxy) value).getHibernateLazyInitializer(); return initializer.getImplementation(); } return value; } @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException { // 解包代理对象 value = unproxy(value); if (value != null && value.getClass().getName().startsWith("java.lang.reflect")) { gen.writeNull(); return; } if (value instanceof List) { handleEntityBasisList((List) value, gen, provider); } else if (value instanceof EntityBasis) { handleSingleEntityBasis((EntityBasis) value, gen, provider); } else { provider.defaultSerializeValue(value, gen); } } private void handleSingleEntityBasis(EntityBasis entity, JsonGenerator gen, SerializerProvider provider) throws IOException { // 解包代理对象 entity = (EntityBasis) unproxy(entity); gen.writeStartObject(); List<Field> fields = getAllFields(entity.getClass()); for (Field field : fields) { field.setAccessible(true); String fieldName = field.getName(); if ("hibernateLazyInitializer".equals(fieldName) || "handler".equals(fieldName)) { continue; } try { Object fieldValue = field.get(entity); // 解包字段值 fieldValue = unproxy(fieldValue); if (fieldValue != null && fieldValue.getClass().getName().startsWith("java.lang.reflect")) { continue; } if (fieldValue instanceof EntityBasis) { Map<String, Object> map = new HashMap<>(); map.put("id", ((EntityBasis) fieldValue).getId()); gen.writeObjectField(fieldName, map); } else if (fieldValue instanceof List) { handleEntityBasisListField((List) fieldValue, fieldName, gen); } else { gen.writeFieldName(fieldName); provider.defaultSerializeValue(fieldValue, gen); } } catch (IllegalAccessException e) { gen.writeFieldName(fieldName); gen.writeNull(); } catch (StackOverflowError e) { gen.writeFieldName(fieldName); gen.writeString("[Circular Reference]"); } } gen.writeEndObject(); } // 修改点1: 处理整个列表对象(如顶级列表) private void handleEntityBasisList(List list, JsonGenerator gen, SerializerProvider provider) throws IOException { // 直接写入空数组 [] 如果列表为null if (list == null) { gen.writeStartArray(); gen.writeEndArray(); return; } gen.writeStartArray(); for (Object item : list) { // 解包列表中的每个元素 item = unproxy(item); if (item instanceof EntityBasis) { handleSingleEntityBasis((EntityBasis) item, gen, provider); } else { provider.defaultSerializeValue(item, gen); } } gen.writeEndArray(); } // 修改点2: 处理实体类中的列表字段 private void handleEntityBasisListField(List list, String fieldName, JsonGenerator gen) throws IOException { gen.writeFieldName(fieldName); // 直接写入空数组 [] 如果列表为null if (list == null) { gen.writeStartArray(); gen.writeEndArray(); return; } // 处理非null列表 gen.writeStartArray(); for (Object item : list) { // 解包列表中的每个元素 item = unproxy(item); if (item instanceof EntityBasis) { gen.writeStartObject(); gen.writeNumberField("id", ((EntityBasis) item).getId()); gen.writeEndObject(); } } gen.writeEndArray(); } private List<Field> getAllFields(Class<?> type) { List<Field> fields = new ArrayList<>(); Class<?> current = type; while (current != null && current != Object.class) { fields.addAll(Arrays.asList(current.getDeclaredFields())); current = current.getSuperclass(); } return fields; } } ================================================================================ /* 文件路径: entity/Information.java */ 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, text, data); } public static Information NewFail(int i, String string) { // TODO Auto-generated method stub return new Information(i,string,null); } public static Information NewFail( String string) { // TODO Auto-generated method stub return new Information(400,string,null); } } ================================================================================ /* 文件路径: entity/Jinhuo.java */ package com.kucun.data.entity; import java.util.Date; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.FullEntitySerializer; @Entity @JsonSerialize(using = FullEntitySerializer.class) public class Jinhuo extends EntityBasis{ @ManyToOne private Dingdan_bancai dingdan_bancai; private Integer shuliang; private Date date; @ManyToOne private User user; private String text=""; private Integer theTypeOfOperation; public Dingdan_bancai getDingdan_bancai() { return dingdan_bancai; } public void setDingdan_bancai(Dingdan_bancai dingdan_bancai) { this.dingdan_bancai = dingdan_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; } public Jinhuo(Integer id, Dingdan_bancai dingdan_bancai, Integer shuliang, Date date, User user) { super(id); this.dingdan_bancai = dingdan_bancai; this.shuliang = shuliang; this.date = date; this.user = user; } public Jinhuo() { super(); // TODO Auto-generated constructor stub } public String getText() { return text; } public void setText(String text) { this.text = text; } public Integer getTheTypeOfOperation() { return theTypeOfOperation; } public void setTheTypeOfOperation(Integer theTypeOfOperation) { this.theTypeOfOperation = theTypeOfOperation; } } ================================================================================ /* 文件路径: entity/Kucun.java */ package com.kucun.data.entity; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.FullEntitySerializer; import com.kucun.data.entity.DTO.UniqueEntity; /** * 库存 * @author Administrator * */ @Entity @JsonSerialize(using = FullEntitySerializer.class) @Table(name="kucun", uniqueConstraints = { @UniqueConstraint(columnNames = "bancai_id") }) @UniqueEntity( repositoryName = "kucun", fields = {"bancai"}, message = "库存已存在" ) public class Kucun extends EntityBasis{ private Integer shuliang; @OneToOne(fetch = FetchType.LAZY) // 正确映射 Bancai 实体 @JoinColumn(name = "bancai_id", referencedColumnName = "id") private Bancai bancai; 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 Kucun(Integer id, Bancai bancai, Integer shuliang) { super(id); this.bancai = bancai; this.shuliang = shuliang; } public Kucun() { super(); // TODO Auto-generated constructor stub } } ================================================================================ /* 文件路径: entity/Mupi.java */ package com.kucun.data.entity; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import org.hibernate.annotations.Type; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.FullEntitySerializer; import com.kucun.data.entity.DTO.UniqueEntity; /** * 木皮 * @author Administrator * */ @Entity @Table(name="mupi") @UniqueEntity( repositoryName = "mupi", fields = {"name", "you"}, message = "木皮已存在" ) @JsonSerialize(using = FullEntitySerializer.class) public class Mupi extends EntityBasis{ /** * 是否有油漆 */ @Column(name="you") @Type(type = "org.hibernate.type.BooleanType") private Boolean you; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } // 添加 OneToMany 映射 @OneToMany(mappedBy = "mupi1") // 指向 Bancai 中的 mupi1 字段 private List<Bancai> bancaisForMupi1; @OneToMany(mappedBy = "mupi2") // 指向 Bancai 中的 mupi2 字段 private List<Bancai> 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; } public Mupi() { super(); } public Boolean getYou() { return you; } public void setYou(Boolean you) { this.you = you; } } ================================================================================ /* 文件路径: entity/SimpleEntity.java */ package com.kucun.data.entity; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuperclass; @MappedSuperclass public abstract class SimpleEntity implements EntityBasisId{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(nullable = false, unique = true) private String name; 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; } // Getters and Setters... } ================================================================================ /* 文件路径: entity/DTO/UniqueEntity.java */ package com.kucun.data.entity.DTO; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.validation.Constraint; import javax.validation.Payload; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = UniqueEntityValidator.class) public @interface UniqueEntity { String message() default "实体已存在"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; String repositoryName(); // 对应的Repository名称 String[] fields(); // 需要检查唯一性的字段 } ================================================================================ /* 文件路径: entity/DTO/UniqueEntityValidator.java */ package com.kucun.data.entity.DTO; import com.kucun.Service.DynamicRepositoryService; import com.kucun.data.entity.EntityBasis; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.repository.JpaRepository; import javax.persistence.EntityManager; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.io.Serializable; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public class UniqueEntityValidator implements ConstraintValidator<UniqueEntity, Object> { @Autowired private DynamicRepositoryService repositoryService; @Autowired private EntityManager entityManager; private String repositoryName; private String[] fields; @Override public void initialize(UniqueEntity constraintAnnotation) { this.repositoryName = constraintAnnotation.repositoryName(); this.fields = constraintAnnotation.fields(); } @Override public boolean isValid(Object entity, ConstraintValidatorContext context) { if (entity == null) return true; try { Class<?> entityClass = entity.getClass(); Map<String, Object> fieldValues = new HashMap<>(); // 收集字段值(处理关联对象) for (String fieldName : fields) { Field field = getField(entityClass, fieldName); field.setAccessible(true); Object value = field.get(entity); if (value instanceof EntityBasis) { // 获取关联对象的ID Field idField = getField(value.getClass(), "id"); idField.setAccessible(true); fieldValues.put(fieldName, idField.get(value)); } else { fieldValues.put(fieldName, value); } } // 构建JPQL查询 StringBuilder jpql = new StringBuilder("SELECT COUNT(e) FROM ") .append(entityClass.getSimpleName()).append(" e WHERE "); int index = 0; for (String fieldName : fields) { if (fieldValues.get(fieldName) == null) { jpql.append("e.").append(fieldName).append(" IS NULL"); } else { jpql.append("e.").append(fieldName); // 处理关联字段的特殊情况 if (isAssociationField(entityClass, fieldName)) { jpql.append(".id = :").append(fieldName); } else { jpql.append(" = :").append(fieldName); } } if (++index < fields.length) jpql.append(" AND "); } // 排除自身(更新操作) Field idField = getField(entityClass, "id"); idField.setAccessible(true); Object idValue = idField.get(entity); if (idValue != null) { jpql.append(" AND e.id <> :id"); } // 执行查询 javax.persistence.Query query = entityManager.createQuery(jpql.toString()); for (String fieldName : fields) { if (fieldValues.get(fieldName) != null) { query.setParameter(fieldName, fieldValues.get(fieldName)); } } if (idValue != null) { query.setParameter("id", idValue); } Long count = (Long) query.getSingleResult(); return count == 0; } catch (Exception e) { e.printStackTrace(); return false; } } // 检查字段是否是关联字段 private boolean isAssociationField(Class<?> entityClass, String fieldName) throws NoSuchFieldException { Field field = getField(entityClass, fieldName); return EntityBasis.class.isAssignableFrom(field.getType()); } // 递归获取字段(包括父类) private Field getField(Class<?> clazz, String fieldName) throws NoSuchFieldException { try { return clazz.getDeclaredField(fieldName); } catch (NoSuchFieldException e) { Class<?> superClass = clazz.getSuperclass(); if (superClass == null) throw e; return getField(superClass, fieldName); } } } ================================================================================ /* 文件路径: entity/User.java */ package com.kucun.data.entity; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.FullEntitySerializer; /** * 用户 * @author Administrator * */ @Entity @Table(name="user") @JsonSerialize(using = FullEntitySerializer.class) public class User extends EntityBasis{ /** * 名字 */ @Column(nullable=false) private String name; /** * 账号 */ @Column(nullable=false) private String andy; /** * 密码 */ @Column(nullable=false) private String pass; /** * 权限 */ @Column(nullable=false) private int role=0; /** * 权限 */ @Column(nullable=false) private int incumbency=0; public User() { super(); } public User(int id, String name, String andy, String pass) { super(id); this.name = name; this.andy = andy; this.pass = pass; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAndy() { return andy; } public void setAndy(String andy) { this.andy = andy; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public int getRole() { return role; } public void setRole(int role) { this.role = role; } public int getIncumbency() { return incumbency; } public void setIncumbency(int incumbency) { this.incumbency = incumbency; } } ================================================================================ /* 文件路径: entity/WechatUser.java */ package com.kucun.data.entity; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.FullEntitySerializer; /** * 微信小程序用户实体类 * 用于对接微信小程序注册申请 */ @Entity @Table(name = "wechat_user") @JsonSerialize(using = FullEntitySerializer.class) public class WechatUser extends EntityBasis { /** * 微信用户唯一标识 */ @Column(nullable = false, unique = true) private String openid; /** * 微信会话密钥 */ private String sessionKey; /** * 用户昵称 */ private String nickname; /** * 用户头像URL */ private String avatarUrl; /** * 手机号码 */ private String phoneNumber; /** * 关联的系统用户ID */ @Column(unique = true) private Long userId; /** * 注册时间 */ @Column(nullable = false) private Date createTime = new Date(); /** * 账号状态:1-审核通过,0-未审核,-1-审核未通过 */ private Integer status = 1; public WechatUser() { super(); } public WechatUser(String openid, String sessionKey, String nickname, String avatarUrl) { super(); this.openid = openid; this.sessionKey = sessionKey; this.nickname = nickname; this.avatarUrl = avatarUrl; } // Getters and Setters public String getOpenid() { return openid; } public void setOpenid(String openid) { this.openid = openid; } public String getSessionKey() { return sessionKey; } public void setSessionKey(String sessionKey) { this.sessionKey = sessionKey; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getAvatarUrl() { return avatarUrl; } public void setAvatarUrl(String avatarUrl) { this.avatarUrl = avatarUrl; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } } ================================================================================ /* 文件路径: entity/Zujian.java */ 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; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.FullEntitySerializer; @Entity @JsonSerialize(using = FullEntitySerializer.class) public class Zujian extends EntityBasis{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } // 反向关联到产品组件 @OneToMany( mappedBy = "zujian", cascade = CascadeType.ALL, fetch = FetchType.LAZY ) private List<Chanpin_zujian> chanping_zujian; public List<Chanpin_zujian> getChanping_zujian() { return chanping_zujian; } public void setChanping_zujian(List<Chanpin_zujian> chanping_zujian) { this.chanping_zujian = chanping_zujian; } } 生成类的关系ER图
最新发布
07-24
package com.kucun.dataDo; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.kucun.data.entity.Dingdan; import com.kucun.data.entity.DTO.DingdanKucunDTO; @Repository public interface DingdanRepository extends JpaRepository<Dingdan, Integer> { boolean existsByNumber(String number); // // // // 自定义查询:获取订单及相关库存信息 // @Query("SELECT new com.kucun.data.dto.OrderInventoryDTO(" + // "d.id, d.number, dc.id, cp.bianhao, b.id, b.houdu, c.name, k.shuliang) " + // "FROM Dingdan d " + // "JOIN d.dingdan_chanpins dc " + // "JOIN dc.chanping cp " + // "JOIN cp.zujians cz " + // "JOIN cz.bancai b " + // "JOIN b.caizhi c " + // "JOIN b.kucun k " + // "WHERE d.id = :orderId") // List<DingdanKucunDTO> findInventoryByOrderId(@Param("orderId") Integer orderId); //订单号查询 @Query("SELECT DISTINCT d FROM Dingdan d " + "WHERE d.number = :number") Dingdan findByNumberWithFullDetails(@Param("number") String number); } package com.kucun.dataDo; import org.springframework.data.jpa.repository.JpaRepository; import com.kucun.data.entity.Chanpin; import com.kucun.data.entity.Kucun; //ChanpinRepository.java public interface KucunRepository extends JpaRepository<Kucun, Integer> { } package com.kucun.dataDo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; import com.kucun.data.entity.Mupi; @Repository public interface MupiRepository extends JpaRepository<Mupi,Integer>{ } package com.kucun.dataDo; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.kucun.data.entity.User; @Repository public interface UserRepository extends JpaRepository<User, Long> { // 登录 @Query(value="select * from user where andy=:andy and pass=:pass",nativeQuery = true) User GetUsers(@Param(value="andy")String andy, @Param("pass")String pass); @Query(value="select * from user where andy=:andy",nativeQuery = true) User findByAndy(@Param(value="andy")String andy); } package com.kucun.dataDo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.kucun.data.entity.Chanpin; import com.kucun.data.entity.Zujian; //ChanpinRepository.java @Repository public interface ZujianRepository extends JpaRepository<Zujian, Integer> { boolean existsByName(String name); } package com.kucun.dataDo; import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.kucun.data.entity.Bancai; import com.kucun.data.entity.DTO.BancaiDTO; @Repository public interface BancaiRepository extends JpaRepository<Bancai, Integer> { @Query("SELECT b FROM Bancai b " + "JOIN b.caizhi c " + "JOIN b.mupi1 m1 " + "JOIN b.mupi2 m2 " + "WHERE c.name = :caizhiName " + "AND m1.name = :mupi1Name " + "AND m2.name = :mupi2Name") List<Bancai> findComplexJoin(@Param("caizhiName") String caizhiName, @Param("mupi1Name") String mupi1Name, @Param("mupi2Name") String mupi2Name); @Query("SELECT COUNT(b) FROM Bancai b " + "JOIN b.caizhi c " + "JOIN b.mupi1 m1 " + "JOIN b.mupi2 m2 " + "WHERE c.id = :caizhiid " + "AND m1.id = :mupi1id " + "AND m2.id = :mupi2id") Integer findComplexidCOUNT(@Param("caizhiid") Integer caizhiid, @Param("mupi1id") Integer mupi1id, @Param("mupi2id") Integer mupi2id); // 使用JOIN FETCH预加载所有关联 @Query("SELECT b FROM Bancai b " + "LEFT JOIN FETCH b.caizhi " + "LEFT JOIN FETCH b.mupi1 " + "LEFT JOIN FETCH b.mupi2 " + "WHERE b.id = :id") Optional<Bancai> findFullDetailById(@Param("id") Integer id); // 获取板材及其关联的所有木皮信息(包括mupi1和mupi2) @Query("SELECT b, c, m1, m2 FROM Bancai b " + "JOIN b.caizhi c " + "JOIN b.mupi1 m1 " + "JOIN b.mupi2 m2 " + "WHERE b.id = :id") List<Object[]> findFullAssociations(@Param("id") Integer id); // 批量获取多个板材的完整信息 @Query("SELECT b FROM Bancai b " + "LEFT JOIN FETCH b.caizhi " + "LEFT JOIN FETCH b.mupi1 " + "LEFT JOIN FETCH b.mupi2 " + "WHERE b.id IN :ids") List<Bancai> findBatchDetails(@Param("ids") List<Integer> ids); // 批量获取所有板材的完整信息 @Query("SELECT b FROM Bancai b " + "LEFT JOIN FETCH b.caizhi " + "LEFT JOIN FETCH b.mupi1 " + "LEFT JOIN FETCH b.mupi2 " ) List<Bancai> findBatchALLDetails(); // 批量获取多个板材的完整信息 @Query("SELECT b FROM Bancai b " + "LEFT JOIN FETCH b.caizhi " + "LEFT JOIN FETCH b.mupi1 " + "LEFT JOIN FETCH b.mupi2 " + "WHERE b.houdu IN :hou") List<Bancai> findBatchHoudu(@Param("hou") List<Double> hou); @Query("SELECT b FROM Bancai b " + "LEFT JOIN FETCH b.caizhi " + "LEFT JOIN FETCH b.mupi1 " + "LEFT JOIN FETCH b.mupi2 " + "LEFT JOIN FETCH b.kucun " + "WHERE b.id = :id") Optional<Bancai> findByIdWithAssociations(@Param("id") int id); @Query("SELECT b FROM Bancai b " + "LEFT JOIN FETCH b.caizhi " + "LEFT JOIN FETCH b.mupi1 " + "LEFT JOIN FETCH b.mupi2 " + "LEFT JOIN FETCH b.kucun ") List<Bancai> findByAllWithAssociations(); } package com.kucun.dataDo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; import com.kucun.data.entity.Caizhi; @Repository public interface CaizhiRepository extends JpaRepository<Caizhi, Integer> { } package com.kucun.dataDo; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.kucun.data.entity.Chanpin; //ChanpinRepository.java @Repository public interface ChanpinRepository extends JpaRepository<Chanpin, Integer> { boolean existsByBianhao(String bianhao); List<Chanpin> findByBianhao(String bianhao); } package com.kucun.dataDo; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.kucun.data.entity.Chanpin; import com.kucun.data.entity.Chanpin_zujian; import com.kucun.data.entity.Dingdan; //ChanpinRepository.java //ChanpinZujianRepository.java @Repository public interface ChanpinZujianRepository extends JpaRepository<Chanpin_zujian, Integer> { boolean existsByChanpin_IdAndZujian_Id(Integer chanpinid, Integer zujianid); Chanpin_zujian findByChanpin_IdAndZujian_Id(Integer chanpinid, Integer zujianid); } package com.kucun.dataDo; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.kucun.data.entity.Chanpin; import com.kucun.data.entity.Dingdan_chanpin; //DingdanChanpinRepository.java @Repository public interface DingdanChanpinRepository extends JpaRepository<Dingdan_chanpin, Integer> { boolean existsByDingdan_IdAndChanpin_Id(Integer dingdanid, Integer chanpinid); List<Dingdan_chanpin> findByChanpin_Id(Integer id); } package com.kucun.dataDo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.kucun.data.entity.Chanpin; import com.kucun.data.entity.Dingdan_chanpin_zujian; //ChanpinRepository.java //DingdanChanpinZujianRepository.java @Repository public interface DingdanChanpinZujianRepository extends JpaRepository<Dingdan_chanpin_zujian, Integer> { boolean existsByDingdan_IdAndZujian_Id(Integer dingdanid, Integer chanpin_zujianid); } package com.kucun.data.entity; import java.util.Date; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.IdOnlySerializer; @Entity public class Jinhuo implements EntityBasis{ @Id private Integer id; @ManyToOne @JsonSerialize(using = IdOnlySerializer.class) private Dingdan dingdan; @ManyToOne @JsonSerialize(using = IdOnlySerializer.class) private Chanpin chanpin; @ManyToOne @JsonSerialize(using = IdOnlySerializer.class) private Zujian zujian; @ManyToOne @JsonSerialize(using = IdOnlySerializer.class) private Bancai bancai; private Integer shuliang; private Date date; @ManyToOne @JsonSerialize(using = IdOnlySerializer.class) 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; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.IdOnlySerializer; /** * 库存 * @author Administrator * */ @Entity public class Kucun implements EntityBasis{ @Id private Integer id; private Long shuliang; @OneToOne(fetch = FetchType.LAZY) // 正确映射 Bancai 实体 @JoinColumn(name = "bancai_id", referencedColumnName = "id") @JsonSerialize(using = IdOnlySerializer.class) 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 javax.persistence.UniqueConstraint; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.IdOnlySerializer; /** * 木皮 * @author Administrator * */ @Entity @Table(name="caizhi", uniqueConstraints = { @UniqueConstraint(columnNames = "name") }) @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) public class Mupi extends SimpleEntity implements EntityBasis{ /** * 是否有油漆 */ private Boolean you; // 添加 OneToMany 映射 @OneToMany(mappedBy = "mupi1") // 指向 Bancai 中的 mupi1 字段 @JsonIgnore @JsonSerialize(contentUsing = IdOnlySerializer.class) private List<Bancai> bancaisForMupi1; @OneToMany(mappedBy = "mupi2") // 指向 Bancai 中的 mupi2 字段 @JsonIgnore @JsonSerialize(contentUsing = IdOnlySerializer.class) private List<Bancai> 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; } public Mupi() { super(); } public Boolean getYou() { return you; } public void setYou(Boolean you) { this.you = you; } } package com.kucun.data.entity; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuperclass; @MappedSuperclass public abstract class SimpleEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(nullable = false, unique = true) private String name; 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; } // Getters and Setters... } package com.kucun.data.entity; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import com.fasterxml.jackson.databind.ObjectMapper; /** * 用户 * @author Administrator * */ @Entity @Table(name="user") public class User implements EntityBasis{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; /** * 名字 */ @Column(nullable=false) private String name; /** * 账号 */ @Column(nullable=false) private String andy; /** * 密码 */ @Column(nullable=false) private String pass; /** * 权限 */ @Column(nullable=false) private int role; public User() { super(); } public User(int id, String name, String andy, String pass) { super(); this.id = id; this.name = name; this.andy = andy; this.pass = pass; } public Integer 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 String getAndy() { return andy; } public void setAndy(String andy) { this.andy = andy; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public int getRole() { System.out.println(role); return role; } public void setRole(int role) { this.role = role; } @Override public String toString() { return "{id:" + id + ", name:" + name + ", andy:" + andy + ", pass:" + pass + ", role:" + role + "}"; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(andy, user.andy)&& Objects.equals(role, user.role); //添加所有属性比较 } @Override public int hashCode() { return Objects.hash(id, name, andy,pass,role); } } 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; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.IdOnlySerializer; @Entity public class Zujian extends SimpleEntity implements EntityBasis{ // 反向关联到产品组件 @OneToMany( mappedBy = "zujian", cascade = CascadeType.ALL, fetch = FetchType.LAZY ) @JsonSerialize(contentUsing = IdOnlySerializer.class) private List<Chanpin_zujian> chanpins; public List<Chanpin_zujian> getChanpins() { return chanpins; } public void setChanpins(List<Chanpin_zujian> chanpins) { this.chanpins = chanpins; } } package com.kucun.data.entity; import java.lang.annotation.Annotation; 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.kucun.data.entity.DTO.*; import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonManagedReference; import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * 板材 * @author Administrator * */ @Entity @Table(name="bancai") public class Bancai implements EntityBasis { @Id private int id; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "caizhi_id") // @JsonManagedReference // 标记为“主”关联方 @JsonSerialize(using = IdOnlySerializer.class) private Caizhi caizhi; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "mupi1_id") @JsonSerialize(using = IdOnlySerializer.class) private Mupi mupi1; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "mupi2_id") @JsonSerialize(using = IdOnlySerializer.class) 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 Integer 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 javax.persistence.UniqueConstraint; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** * 板材材质 * @author Administrator * */ @Entity @Table(name="caizhi", uniqueConstraints = { @UniqueConstraint(columnNames = "name") }) @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) public class Caizhi extends SimpleEntity{ @OneToMany(mappedBy="caizhi") @JsonIgnore private List<Bancai> bancais; 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); } public List<Bancai> getBancais() { return bancais; } public void setBancais(List<Bancai> bancais) { this.bancais = bancais; } } 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.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.IdOnlySerializer; /** * 产品类 * @author Administrator * */ @Entity @Table(name="chanpin", uniqueConstraints = { @UniqueConstraint(columnNames = "bianhao") }) public class Chanpin implements EntityBasis { @Id private Integer id; // 关联订单产品 @OneToMany( mappedBy = "chanpin", cascade = CascadeType.ALL, fetch = FetchType.LAZY ) @JsonSerialize(contentUsing = IdOnlySerializer.class) private List<Dingdan_chanpin> dingdans; private String bianhao; @OneToMany( mappedBy = "chanpin", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true ) @JsonSerialize(contentUsing = IdOnlySerializer.class) private List<Chanpin_zujian> zujians; // 添加/移除组件的辅助方法 public void addZujian(Chanpin_zujian zujian) { zujians.add(zujian); zujian.setChanpin(this); } public void removeZujian(Chanpin_zujian zujian) { zujians.remove(zujian); zujian.setChanpin(null); } // 添加/移除组件的辅助方法 public void addDingdan(Dingdan_chanpin dingdan) { dingdans.add(dingdan); dingdan.setChanpin(this); } public void removeDingdan(Dingdan_chanpin dingdian) { dingdans.remove(dingdian); dingdian.setChanpin(null); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public List<Dingdan_chanpin> getDingdans() { return dingdans; } public void setDingdans(List<Dingdan_chanpin> dingdans) { this.dingdans = dingdans; } 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.dingdans = 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.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.IdOnlySerializer; /** * 产品组件关联类 * @author Administrator * */ @Entity @Table(name="chanpin_zujian") public class Chanpin_zujian implements EntityBasis { @Id private Integer id; // 关联到产品 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chanpin_id") @JsonSerialize(using = IdOnlySerializer.class) private Chanpin chanpin; // 关联到组件 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "zujian_id") @JsonSerialize(using = IdOnlySerializer.class) private Zujian zujian; // 关联到板材 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "bancai_id") @JsonSerialize(using = IdOnlySerializer.class) private Bancai bancai; private Double one_howmany; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } 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 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.Date; 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; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.IdOnlySerializer; /** * 订单 * @author Administrator * */ @Entity @Table(name="dingdan", uniqueConstraints = { @UniqueConstraint(columnNames = "number") }) public class Dingdan implements EntityBasis{ @Id private Integer id; //订单号 private String number; private Date xiadan; private Date jiaohuo; @OneToMany( mappedBy = "dingdan", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true ) @JsonSerialize(contentUsing = IdOnlySerializer.class) private List<Dingdan_chanpin> dingdan_chanpins; // 优化订单与订单组件关联 @OneToMany( mappedBy = "dingdan", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true ) @JsonSerialize(contentUsing = IdOnlySerializer.class) private List<Dingdan_chanpin_zujian> dingdan_chanpins_zujians; public Date getXiadan() { return xiadan; } public void setXiadan(Date xiadan) { this.xiadan = xiadan; } public Date getJiaohuo() { return jiaohuo; } public void setJiaohuo(Date jiaohuo) { this.jiaohuo = jiaohuo; } 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<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 javax.persistence.CascadeType; 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.Table; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.IdOnlySerializer; /** * 订单和产品关联 * @author Administrator * */ @Entity @Table(name="dingdan_chanpin") public class Dingdan_chanpin implements EntityBasis { @Id private Integer id; //产品信息 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "dingdan_id") // 指 @JsonSerialize(using = IdOnlySerializer.class) private Dingdan dingdan; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chanpin_id") // 指 @JsonSerialize(using = IdOnlySerializer.class) private Chanpin chanpin; private Integer shuliang;//产品数量; public Chanpin getChanpin() { return chanpin; } public void setChanpin(Chanpin chanpin) { this.chanpin = chanpin; } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { this.shuliang = shuliang; } 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 javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.kucun.data.entity.DTO.IdOnlySerializer; /** * 一个订单中的产品组件订购板材数量 * @author Administrator * */ @Entity public class Dingdan_chanpin_zujian implements EntityBasis{ @Id private Integer id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "dingdan_id") // 指定外键列 @JsonSerialize(using = IdOnlySerializer.class) private Dingdan dingdan; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chanpin_zujian_id") // 指定外键列 @JsonSerialize(using = IdOnlySerializer.class) private Chanpin_zujian zujian; // 修改为单数形式 //板材 @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "bancai_id") @JsonSerialize(using = IdOnlySerializer.class) private Bancai bancai; //订购数 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 getZujian() { return zujian; } public void setZujian(Chanpin_zujian zujian) { this.zujian = zujian; } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { this.shuliang = shuliang; } } package com.kucun.data.entity; public interface EntityBasis { Integer getId(); } 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.DTO; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.module.SimpleModule; import com.kucun.data.entity.EntityBasis; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonConfig { @Bean public Module idOnlyModule() { SimpleModule module = new SimpleModule(); module.addSerializer(EntityBasis.class, new IdOnlySerializer()); return module; } } package com.kucun.data.entity.DTO; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.kucun.data.entity.EntityBasis; import java.io.IOException; public class IdOnlySerializer extends JsonSerializer<EntityBasis> { @Override public void serialize(EntityBasis entity, JsonGenerator gen, SerializerProvider provider) throws IOException { if (entity == null) { gen.writeNull(); } else { gen.writeStartObject(); gen.writeNumberField("id", entity.getId()); gen.writeEndObject(); } } } /** *1输出所有实体类 * @return */ @GetMapping("/alle") public Map<String, Object> getAllDataWithChildIdse() { Map<String, Object> response = new HashMap<>(); response.put("caizhis", (caizhiRepository.findAll())); response.put("bancais", (bancaiRepository.findAll())); response.put("chanpins", (chanpinRepository.findAll())); response.put("dingdans", (dingdanRepository.findAll())); response.put("mupis", (mupiRepository.findAll())); response.put("zujians", (zujianRepository.findAll())); response.put("kucuns", (kucunRepository.findAll())); response.put("users", (userRepository.findAll())); response.put("chanpin_zujians", (chanpinZujianRepository.findAll())); response.put("chanpin_zujians", (dingdanChanpinZujianRepository.findAll())); response.put("chanpin_zujians", (dingdanChanpinRepository.findAll())); return response; } 输出:{"bancais":[{"id":1},{"id":2}],"dingdans":[{"id":1}],"mupis":[{"id":1},{"id":2},{"id":3}],"chanpins":[{"id":1}],"kucuns":[{"id":1},{"id":2}],"chanpin_zujians":[{"id":1}],"zujians":[{"id":1}],"caizhis":[{"id":1,"name":"千和板"},{"id":3,"name":"杉木"},{"id":2,"name":"桃花芯"}],"users":[{"id":1}]} 我需要的是实体类中的下级类 只剩下id一个字段,不是全部
06-10
Files contained in javax.persistence.jar: META-INF/MANIFEST.MF javax.persistence.Access.class javax.persistence.AccessType.class javax.persistence.AssociationOverride.class javax.persistence.AssociationOverrides.class javax.persistence.AttributeOverride.class javax.persistence.AttributeOverrides.class javax.persistence.Basic.class javax.persistence.Cache.class javax.persistence.Cacheable.class javax.persistence.CacheRetrieveMode.class javax.persistence.CacheStoreMode.class javax.persistence.CascadeType.class javax.persistence.CollectionTable.class javax.persistence.Column.class javax.persistence.ColumnResult.class javax.persistence.criteria.AbstractQuery.class javax.persistence.criteria.CollectionJoin.class javax.persistence.criteria.CompoundSelection.class javax.persistence.criteria.CriteriaBuilder.class javax.persistence.criteria.CriteriaQuery.class javax.persistence.criteria.Expression.class javax.persistence.criteria.Fetch.class javax.persistence.criteria.FetchParent.class javax.persistence.criteria.From.class javax.persistence.criteria.Join.class javax.persistence.criteria.JoinType.class javax.persistence.criteria.ListJoin.class javax.persistence.criteria.MapJoin.class javax.persistence.criteria.Order.class javax.persistence.criteria.ParameterExpression.class javax.persistence.criteria.Path.class javax.persistence.criteria.PluralJoin.class javax.persistence.criteria.Predicate.class javax.persistence.criteria.Root.class javax.persistence.criteria.Selection.class javax.persistence.criteria.SetJoin.class javax.persistence.criteria.Subquery.class javax.persistence.DiscriminatorColumn.class javax.persistence.DiscriminatorType.class javax.persistence.DiscriminatorValue.class javax.persistence.ElementCollection.class javax.persistence.Embeddable.class javax.persistence.Embedded.class javax.persistence.EmbeddedId.class javax.persistence.Entity.class javax.persistence.EntityExistsException.class javax.persistence.EntityListeners.class javax.persistence.EntityManager.c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值