/* 文件路径: java/com/kucun/data/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();
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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;
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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;
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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;
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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
}
}
================================================================================
/* 文件路径: java/com/kucun/data/entity/EntityBasisId.java */
package com.kucun.data.entity;
public interface EntityBasisId {
Integer getId();
void setId(Integer id);
}
================================================================================
/* 文件路径: java/com/kucun/data/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;
}
}
================================================================================
/* 文件路径: java/com/kucun/data/entity/entityUML.txt */
@startuml
' 基础类与接口
abstract class EntityBasis {
+ Integer id
+ Date lastUpdated
+ Boolean deleted
+ Date deletedAt
+ getId()
+ setId(Integer)
}
interface EntityBasisId {
+ getId()
+ setId(Integer)
}
abstract class SimpleEntity {
+ Integer id
+ String name
}
' 实体类定义
class Mupi {
+ Boolean you
+ String name
+ List<Bancai> bancaisForMupi1
+ List<Bancai> bancaisForMupi2
}
class User {
+ String name
+ String andy
+ String pass
+ int role
+ int incumbency
}
class Chanpin_zujian {
+ Double one_howmany
+ Double zujianshu
}
class WechatUser {
+ String openid
+ String sessionKey
+ String nickname
+ String avatarUrl
+ String phoneNumber
+ Long userId
+ Date createTime
+ Integer status
}
class Kucun {
+ Integer shuliang
}
class Dingdan_chanpin {
+ Integer shuliang
}
class Information {
+ Integer Status
+ String text
+ Object data
}
class Zujian {
+ String name
+ List<Chanpin_zujian> chanping_zujian
}
class Dingdan_bancai {
+ Integer shuliang
+ Integer currentUserId
}
class Dingdan {
+ String number
+ Date xiadan
+ Date jiaohuo
+ List<Dingdan_chanpin> dingdan_chanpin
}
class Jinhuo {
+ Integer shuliang
+ Date date
+ String text
+ Integer theTypeOfOperation
}
class Caizhi {
+ String name
+ List<Bancai> bancai
}
class Bancai {
+ Double houdu
}
' 继承关系
EntityBasis --|> EntityBasisId
SimpleEntity --|> EntityBasisId
Mupi --|> EntityBasis
User --|> EntityBasis
Chanpin_zujian --|> EntityBasis
WechatUser --|> EntityBasis
Kucun --|> EntityBasis
Dingdan_chanpin --|> EntityBasis
Zujian --|> EntityBasis
Dingdan_bancai --|> EntityBasis
Dingdan --|> EntityBasis
Jinhuo --|> EntityBasis
Caizhi --|> EntityBasis
Bancai --|> EntityBasis
' 关联关系
' 一对一
Bancai -- Kucun : 1:1 (kucun)
' 一对多/多对一
Caizhi "1" -- "*" Bancai : 包含 (bancai)
Mupi "1" -- "*" Bancai : 作为mupi1 (bancaisForMupi1)
Mupi "1" -- "*" Bancai : 作为mupi2 (bancaisForMupi2)
Chanpin "1" -- "*" Chanpin_zujian : 包含 (chanpin_zujian)
Zujian "1" -- "*" Chanpin_zujian : 关联 (chanping_zujian)
Bancai "1" -- "*" Chanpin_zujian : 被使用 (bancai)
Dingdan "1" -- "*" Dingdan_chanpin : 包含 (dingdan_chanpin)
Chanpin "1" -- "*" Dingdan_chanpin : 被订购 (chanpin)
Dingdan "1" -- "*" Dingdan_bancai : 包含 (dingdan)
Chanpin "1" -- "*" Dingdan_bancai : 关联 (chanpin)
Zujian "1" -- "*" Dingdan_bancai : 关联 (zujian)
Bancai "1" -- "*" Dingdan_bancai : 被订购 (bancai)
User "1" -- "*" Jinhuo : 操作 (user)
Dingdan_bancai "1" -- "*" Jinhuo : 关联 (dingdan_bancai)
' 单向关联
WechatUser -- User : 绑定 (userId)
@enduml
================================================================================
/* 文件路径: java/com/kucun/data/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;
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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);
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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;
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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;
}
public Mupi() {
super();
}
public Boolean getYou() {
return you;
}
public void setYou(Boolean you) {
this.you = you;
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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...
}
================================================================================
/* 文件路径: java/com/kucun/data/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(); // 需要检查唯一性的字段
}
================================================================================
/* 文件路径: java/com/kucun/data/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);
}
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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;
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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;
}
}
================================================================================
/* 文件路径: java/com/kucun/data/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;
}
}
根据实体类结构给出数据库表结构图
最新发布