关于JAVA Entity entity = entityClass.getAnnotation(Entity.class);

本文解析了一个用于获取实体名称的方法,介绍了如何从实体类中提取名称,并解释了当实体类定义了特定名称时如何覆盖默认类名。

关于JAVA Entity entity = entityClass.getAnnotation(Entity.class);

2013-08-31 15:50匿名  |  浏览 1663 次
protected String entityName(Class<T> entityClass)
	{
		String entityName = entityClass.getSimpleName();
		Entity entity = entityClass.getAnnotation(Entity.class);
		if(entity.name()!=null&&!"".equals(entity.name()))
		{
			entityName = entity.name();
		}
		return entityName;
	}

这里大概说是什么意思??
2013-09-06 00:58 提问者采纳

该方法用于取得指定的实体类的实体名称。如果指定的实体类的实体标签定义了名称,则取该名称,否则取类名。

 

例如:有实体类SampleEntity

1
2
3
4
5
6
import  javax.persistence.Entity;
  
@Entity (name =  "SpecialName" )
public  class  SampleEntity {
  
}

以SampleEntity类作为参数调用entityName方法:

1、方法中第一行,String entityName = entityClass.getSimpleName();

      变量entityName的值设为类SampleEntity的短名称,即“SampleEntity”。

2、方法中第二行,Entity entity = entityClass.getAnnotation(Entity.class);

      即取得SampleEntity的@Entity标签。

3、方法中第三行到第六行,if(entity.name()!=null&&!"".equals(entity.name()))
                                             {
                                                 entityName = entity.name();

                                             }

      即@Entity标签中定义了name并且name不是空串时, 变量entityName的值设为@Entity标签中name的值,即“SpecialName”。

 4、返回变量entityName,值为“SpecialName”。

 

 

如果SampleEntity的@Entity标签没有定义name

1
2
3
4
5
6
import  javax.persistence.Entity;
 
@Entity
public  class  SampleEntity {
 
}

 方法中第三行,if(entity.name()!=null&&!"".equals(entity.name()))条件不成立,最终方法返回变量entityName,值为“SampleEntity”。

/* 文件路径: Bancai.java */ package com.example.kucun2.entity; import android.annotation.SuppressLint; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.Collections; import java.util.Map; import java.util.Objects; //板材 public class Bancai extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; @RefTo(target = Caizhi.class, type = RefType.SINGLE) private Caizhi caizhi; @RefTo(target = Mupi.class, type = RefType.SINGLE) private Mupi mupi1; @RefTo(target = Mupi.class, type = RefType.SINGLE) private Mupi mupi2; @RefTo(target = Dingdan_chanpin_zujian.class, type = RefType.SINGLE) private Dingdan_chanpin_zujian Dingdan_chanpin_zujian; private Double houdu; public Bancai() { } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Bancai bancai = (Bancai) o; return Objects.equals(id, bancai.id) ; } public Bancai(Integer id, Caizhi caizhi, Mupi mupi1, Mupi mupi2, Double houdu) { this.id = id; this.caizhi = caizhi; this.mupi1 = mupi1; this.mupi2 = mupi2; this.houdu = houdu; } @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Caizhi getCaizhi() { return caizhi; } public void setCaizhi(Caizhi caizhi) { Caizhi oldValue = this.caizhi; this.caizhi = caizhi; firePropertyChange("caizhi", oldValue, caizhi); } public Mupi getMupi1() { return mupi1; } public void setMupi1(Mupi mupi1) { Mupi oldValue = this.mupi1; this.mupi1 = mupi1; firePropertyChange("mupi1", oldValue, mupi1); } public Mupi getMupi2() { return mupi2; } public void setMupi2(Mupi mupi2) { Mupi oldValue = this.mupi2; this.mupi2 = mupi2; firePropertyChange("mupi2", oldValue, mupi2); } public Double getHoudu() { return houdu; } public void setHoudu(Double houdu) { Double oldValue = this.houdu; this.houdu = houdu; firePropertyChange("houdu", oldValue, houdu); } /** * 表格中显示的文字 * * @return */ @SuppressLint("DefaultLocale") public String TableText() { String boardInfo = ""; if (caizhi==null){return "";} boardInfo += String.format("%.1f", this.getHoudu()) + this.getCaizhi().getName() + "("; if (mupi1 != null) { boardInfo += (this.getMupi1().getYou() ? this.getMupi1().getName() + "油" : this.getMupi1().getName()); } if (mupi2 != null && mupi1 != null) { boardInfo += ","; } if (mupi2 != null) { boardInfo += (this.getMupi2().getYou() ? this.getMupi2().getName() + "油" : this.getMupi2().getName()); } boardInfo += ")"; return boardInfo; } public com.example.kucun2.entity.Dingdan_chanpin_zujian getDingdan_chanpin_zujian() { return Dingdan_chanpin_zujian; } public void setDingdan_chanpin_zujian(com.example.kucun2.entity.Dingdan_chanpin_zujian dingdan_chanpin_zujian) { com.example.kucun2.entity.Dingdan_chanpin_zujian oldValue = this.Dingdan_chanpin_zujian; Dingdan_chanpin_zujian = dingdan_chanpin_zujian; firePropertyChange("dingdan_chanpin_zujian", oldValue, dingdan_chanpin_zujian); } } ================================================================================ /* 文件路径: Caizhi.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.ArrayList; import java.util.List; import java.util.Objects; //材质 public class Caizhi extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String name; @RefTo(target = Bancai.class, type = RefType.LIST, bidirectional = true, reverseField = "caizhi") private List<Bancai> bancai = new ArrayList<>(); @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public String getName() { return name; } public void setName(String name) { String oldValue = this.name; this.name = name; firePropertyChange("name", oldValue, name); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Caizhi caizhi = (Caizhi) o; return Objects.equals(name, caizhi.name); } @Override public int hashCode() { return Objects.hashCode(name); } public List<Bancai> getBancai() { return bancai; } public void setBancai(List<Bancai> bancai) { List<Bancai> oldValue = this.bancai; this.bancai = bancai; firePropertyChange("bancai", oldValue, bancai); } } ================================================================================ /* 文件路径: Chanpin_Zujian.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; //产品组件关联 public class Chanpin_Zujian extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private Double one_howmany; @RefTo(target = Chanpin.class, type = RefType.SINGLE) private Chanpin chanpin; @RefTo(target = Zujian.class, type = RefType.SINGLE) private Zujian zujian; @RefTo(target = Bancai.class, type = RefType.SINGLE) private Bancai bancai; public Chanpin_Zujian() { super(); } @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Chanpin getChanpin() { return chanpin; } public void setChanpin(Chanpin chanpin) { Chanpin oldValue = this.chanpin; this.chanpin = chanpin; firePropertyChange("chanpin", oldValue, chanpin); } public Zujian getZujian() { return zujian; } public void setZujian(Zujian zujian) { Zujian oldValue = this.zujian; this.zujian = zujian; firePropertyChange("zujian", oldValue, zujian); } public Double getOne_howmany() { return one_howmany; } public void setOne_howmany(Double one_howmany) { Double oldValue = this.one_howmany; this.one_howmany = one_howmany; firePropertyChange("one_howmany", oldValue, one_howmany); } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { Bancai oldValue = this.bancai; this.bancai = bancai; firePropertyChange("bancai", oldValue, bancai); } } ================================================================================ /* 文件路径: Chanpin.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.ArrayList; import java.util.List; //产品 public class Chanpin extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String bianhao; @RefTo(target = Chanpin_Zujian.class, type = RefType.LIST) private List<Chanpin_Zujian> chanpinZujian = new ArrayList<>(); @RefTo(target = Dingdan_Chanpin.class, type = RefType.LIST) private List<Dingdan_Chanpin> dingdanChanpin = new ArrayList<>(); @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public List<Chanpin_Zujian> getChanpinZujian() { return chanpinZujian; } public void setChanpinZujian(List<Chanpin_Zujian> chanpinZujian) { List<Chanpin_Zujian> oldValue = this.chanpinZujian; this.chanpinZujian = chanpinZujian; firePropertyChange("chanpinZujian", oldValue, chanpinZujian); } public List<Dingdan_Chanpin> getDingdanChanpin() { return dingdanChanpin; } public void setDingdanChanpin(List<Dingdan_Chanpin> dingdanChanpin) { List<Dingdan_Chanpin> oldValue = this.dingdanChanpin; this.dingdanChanpin = dingdanChanpin; firePropertyChange("dingdanChanpin", oldValue, dingdanChanpin); } public Chanpin() { } public String getBianhao() { return bianhao; } public void setBianhao(String bianhao) { String oldValue = this.bianhao; this.bianhao = bianhao; firePropertyChange("bianhao", oldValue, bianhao); } } ================================================================================ /* 文件路径: Dingdan_chanpin_zujian.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; /** * 、 * 订单板材关联 */ public class Dingdan_chanpin_zujian extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; @RefTo(target = Dingdan.class, type = RefType.SINGLE) private Dingdan dingdian; @RefTo(target = Chanpin_Zujian.class, type = RefType.SINGLE) private Chanpin_Zujian zujian; @RefTo(target = Bancai.class, type = RefType.SINGLE) private Bancai bancai; private Integer shuliang; @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Dingdan getDingdian() { return dingdian; } public void setDingdian(Dingdan dingdian) { Dingdan oldValue = this.dingdian; this.dingdian = dingdian; firePropertyChange("dingdian", oldValue, dingdian); } public Chanpin_Zujian getZujian() { return zujian; } public void setZujian(Chanpin_Zujian zujian) { Chanpin_Zujian oldValue = this.zujian; this.zujian = zujian; firePropertyChange("zujian", oldValue, zujian); } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { Bancai oldValue = this.bancai; this.bancai = bancai; firePropertyChange("bancai", oldValue, bancai); } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { Integer oldValue = this.shuliang; this.shuliang = shuliang; firePropertyChange("shuliang", oldValue, shuliang); } public Dingdan_chanpin_zujian() { } } ================================================================================ /* 文件路径: Dingdan_Chanpin.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; /** * 订单产品关联 */ public class Dingdan_Chanpin extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; @RefTo(target = Dingdan.class, type = RefType.SINGLE) private Dingdan dingdan; @RefTo(target = Chanpin.class, type = RefType.SINGLE) private Chanpin chanpin; private Integer shuliang; public Dingdan_Chanpin(Integer id, Dingdan dingdan, Chanpin chanpin, Integer shuliang) { this.id = id; this.dingdan = dingdan; this.chanpin = chanpin; this.shuliang = shuliang; } @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Dingdan getDingdan() { return dingdan; } public void setDingdan(Dingdan dingdan) { Dingdan oldValue = this.dingdan; this.dingdan = dingdan; firePropertyChange("dingdan", oldValue, dingdan); } public Chanpin getChanpin() { return chanpin; } public void setChanpin(Chanpin chanpin) { Chanpin oldValue = this.chanpin; this.chanpin = chanpin; firePropertyChange("chanpin", oldValue, chanpin); } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { Integer oldValue = this.shuliang; this.shuliang = shuliang; firePropertyChange("shuliang", oldValue, shuliang); } public Dingdan_Chanpin() { } } ================================================================================ /* 文件路径: Dingdan.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 订单 */ public class Dingdan extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String number; @RefTo(target = Dingdan_Chanpin.class, type = RefType.LIST) private List<Dingdan_Chanpin> dingdanChanpin = new ArrayList<>(); @RefTo(target = Dingdan_chanpin_zujian.class, type = RefType.LIST) private List<Dingdan_chanpin_zujian> dingdanChanpinZujian = new ArrayList<>(); private Date xiadan; private Date jiaohuo; public List<Dingdan_Chanpin> getDingdanChanpin() { return dingdanChanpin; } public void setDingdanChanpin(List<Dingdan_Chanpin> dingdanChanpin) { List<Dingdan_Chanpin> oldValue = this.dingdanChanpin; this.dingdanChanpin = dingdanChanpin; firePropertyChange("dingdanChanpin", oldValue, dingdanChanpin); } @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public String getNumber() { return number; } public void setNumber(String number) { String oldValue = this.number; this.number = number; firePropertyChange("number", oldValue, number); } public Date getXiadan() { return xiadan; } public void setXiadan(Date xiadan) { Date oldValue = this.xiadan; this.xiadan = xiadan; firePropertyChange("xiadan", oldValue, xiadan); } public Date getJiaohuo() { return jiaohuo; } public void setJiaohuo(Date jiaohuo) { Date oldValue = this.jiaohuo; this.jiaohuo = jiaohuo; firePropertyChange("jiaohuo", oldValue, jiaohuo); } public Dingdan() { } public List<Dingdan_chanpin_zujian> getDingdanChanpinZujian() { return dingdanChanpinZujian; } public void setDingdanChanpinZujian(List<Dingdan_chanpin_zujian> dingdanChanpinZujian) { List<Dingdan_chanpin_zujian> oldValue = this.dingdanChanpinZujian; this.dingdanChanpinZujian = dingdanChanpinZujian; firePropertyChange("dingdanChanpinZujian", oldValue, dingdanChanpinZujian); } } ================================================================================ /* 文件路径: Information.java */ package com.example.kucun2.entity; import android.annotation.SuppressLint; import androidx.annotation.Keep; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; @Keep // 防止Proguard混淆 public class Information<T> { private Integer status; private String text; private T data; // 使用泛型保证类型安全 private static final Gson gson = new Gson(); // Gson实例复用 // 构造方法 public Information(Integer status, String text, T data) { this.status = status; this.text = text; this.data = data; } // JSON反序列化构造方法 @SuppressLint("NewApi") public Information(Integer status, String text, String jsonData, Type dataType) { this.status = status; this.text = text; try { this.data = gson.fromJson(jsonData, dataType); } catch (JsonSyntaxException e) { this.data = null; // 处理解析失败 } } // 空构造方法 public Information() { } // 序列化为JSON public String toJson() { return gson.toJson(this); } // 静态创建方法 public static <T> Information<T> newSuccess(T data) { return new Information<>(200, "success", data); } public static Information<String> newSuccess(String text) { return new Information<>(200, "success", text); } public static <T> Information<T> newFail(int status, String text, T data) { return new Information<>(status, text, data); } // Getter/Setter public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getText() { return text; } public void setText(String text) { this.text = text; } public T getData() { return data; } public void setData(T data) { this.data = data; } } ================================================================================ /* 文件路径: Jinhuo.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.Date; /** * 进货消耗类 */ public class Jinhuo extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer shuliang; private Integer id; @RefTo(target = Dingdan.class, type = RefType.SINGLE) private Dingdan dingdan; @RefTo(target = Chanpin.class, type = RefType.SINGLE) private Chanpin chanpin; @RefTo(target = Zujian.class, type = RefType.SINGLE) private Zujian zujian; @RefTo(target = Bancai.class, type = RefType.SINGLE) private Bancai bancai; @RefTo(target = User.class, type = RefType.SINGLE) private User user; private Date date; 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 } @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Dingdan getDingdan() { return dingdan; } public void setDingdan(Dingdan dingdan) { Dingdan oldValue = this.dingdan; this.dingdan = dingdan; firePropertyChange("dingdan", oldValue, dingdan); } public Chanpin getChanpin() { return chanpin; } public void setChanpin(Chanpin chanpin) { Chanpin oldValue = this.chanpin; this.chanpin = chanpin; firePropertyChange("chanpin", oldValue, chanpin); } public Zujian getZujian() { return zujian; } public void setZujian(Zujian zujian) { Zujian oldValue = this.zujian; this.zujian = zujian; firePropertyChange("zujian", oldValue, zujian); } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { Bancai oldValue = this.bancai; this.bancai = bancai; firePropertyChange("bancai", oldValue, bancai); } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { Integer oldValue = this.shuliang; this.shuliang = shuliang; firePropertyChange("shuliang", oldValue, shuliang); } public Date getDate() { return date; } public void setDate(Date date) { Date oldValue = this.date; this.date = date; firePropertyChange("date", oldValue, date); } public User getUser() { return user; } public void setUser(User user) { User oldValue = this.user; this.user = user; firePropertyChange("user", oldValue, user); } } ================================================================================ /* 文件路径: Kucun.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; /** * 库存 */ public class Kucun extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private Integer shuliang; @RefTo(target = Bancai.class, type = RefType.SINGLE) private Bancai bancai; @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { Integer oldValue = this.shuliang; this.shuliang = shuliang; firePropertyChange("shuliang", oldValue, shuliang); } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { Bancai oldValue = this.bancai; this.bancai = bancai; firePropertyChange("bancai", oldValue, bancai); } public Kucun() { } public Kucun(Bancai bancai) { this.bancai = bancai; } public Kucun(Integer id, Integer shuliang, Bancai bancai) { this.id = id; this.shuliang = shuliang; this.bancai = bancai; } } ================================================================================ /* 文件路径: Mupi.java */ package com.example.kucun2.entity; import android.annotation.SuppressLint; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.ArrayList; import java.util.List; public class Mupi extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String name; /** * 是否有油漆 */ private Boolean you = false; @RefTo(target = Bancai.class, type = RefType.LIST, bidirectional = true, reverseField = "mupi1") private List<Bancai> bancais = new ArrayList<>(); @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public String getName() { return name; } public void setName(String name) { String oldValue = this.name; this.name = name; firePropertyChange("name", oldValue, name); } public Boolean getYou() { if (you == null) { you = false; return false; } return you; } public void setYou(Boolean you) { if (you == null) return; Boolean oldValue = this.you; this.you = you; firePropertyChange("you", oldValue, you); } public List<Bancai> getBancais() { return bancais; } public void setBancais(List<Bancai> bancais) { List<Bancai> oldValue = this.bancais; this.bancais = bancais; firePropertyChange("bancais", oldValue, bancais); } public Mupi() { } public Mupi(Integer id, String name, List<Bancai> bancais) { this.id = id; this.name = name; this.bancais = bancais; } public Mupi(List<Bancai> bancais, Boolean you, String name, Integer id) { this.bancais = bancais; this.you = you; this.name = name; this.id = id; } // 3. 木皮显示格式化方法 public String formatMupiDisplay() { return getName() + (getYou() ? "油" : ""); } } ================================================================================ /* 文件路径: RefTo.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.SynchronizableEntity; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 关联关系注解 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface RefTo { /** * 关联的目标实体类型 */ Class<?> target(); /** * 关联类型(单引用/列表) */ RefType type() default RefType.SINGLE; /** * 存储关联ID的字段名(默认为当前字段) */ String idField() default ""; /** * 是否双向关联 */ boolean bidirectional() default false; /** * 双向关联时的反向字段名 */ String reverseField() default ""; } ================================================================================ /* 文件路径: RefType.java */ package com.example.kucun2.entity; /** * 关联类型枚举 */ public enum RefType { SINGLE, // 单实体引用 LIST // 实体列表引用 } ================================================================================ /* 文件路径: User.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; /** * 用户实体类(扩展版) * 添加了当前用户标记功能 */ public class User extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String name; private String andy; private String pass; private Integer role; private boolean isCurrentUser; // 新增字段:标记当前用户 // ====================== Getter/Setter ====================== @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public String getName() { return name; } public void setName(String name) { String oldValue = this.name; this.name = name; firePropertyChange("name", oldValue, name); } public String getAndy() { return andy; } public void setAndy(String andy) { String oldValue = this.andy; this.andy = andy; firePropertyChange("andy", oldValue, andy); } public String getPass() { return pass; } public void setPass(String pass) { String oldValue = this.pass; this.pass = pass; firePropertyChange("pass", oldValue, pass); } public Integer getRole() { return role; } public void setRole(Integer role) { Integer oldValue = this.role; this.role = role; firePropertyChange("role", oldValue, role); } // ====================== 当前用户管理 ====================== public boolean isCurrentUser() { return isCurrentUser; } public void setIsCurrentUser(boolean isCurrentUser) { boolean oldValue = this.isCurrentUser; this.isCurrentUser = isCurrentUser; firePropertyChange("isCurrentUser", oldValue, isCurrentUser); } // ====================== 构造方法 ====================== public User(int id, String name, String andy, String pass, int role) { this.id = id; this.name = name; this.andy = andy; this.pass = pass; this.role = role; } public User() { // 默认构造器 } } ================================================================================ /* 文件路径: Zujian.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; /** * 组件 */ public class Zujian extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String name; public Zujian() { } public Zujian(Integer id, String name) { this.id = id; this.name = name; } @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public String getName() { return name; } public void setName(String name) { String oldValue = this.name; this.name = name; firePropertyChange("name", oldValue, name); } }
06-18
package com.sjsemi.util; import com.sjsemi.common.utils.FormatUtils; import lombok.var; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; import java.beans.Introspector; import java.lang.reflect.Field; import java.util.stream.Collectors; import javax.persistence.Column; import javax.persistence.Table; import javax.persistence.Id; public class BeanMapper { /** * 动态映射数据库记录到目标对象 * * @param target 目标对象 * @param record 数据库记录 */ public static void mapFields(Object target, Map<String, Object> record) { try { var beanInfo = Introspector.getBeanInfo(target.getClass()); for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) { if ("class".equals(pd.getName())) continue; var setter = pd.getWriteMethod(); if (setter == null) continue; // 获取字段对象 Field field = null; try { field = target.getClass().getDeclaredField(pd.getName()); } catch (NoSuchFieldException e) { continue; // 跳过不存在的字段 } // 检查@Column注解 Column columnAnnotation = field.getAnnotation(Column.class); String columnName; if (columnAnnotation != null) { columnName = columnAnnotation.name(); // 使用注解指定的列名 } else { columnName = toColumnName(pd.getName()); // 默认转换 } // 获取值并转换 var value = record.get(columnName); var convertedValue = convertValue(value, pd.getPropertyType()); if (convertedValue != null) { setter.invoke(target, convertedValue); } } } catch (Exception e) { e.printStackTrace(); } } /** * 将对象转换为参数Map */ public static Map<String, Object> toParamMap(Object entity) { Map<String, Object> paramMap = new HashMap<>(); try { BeanInfo beanInfo = Introspector.getBeanInfo(entity.getClass()); for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) { if ("class".equals(pd.getName())) continue; Method readMethod = pd.getReadMethod(); if (readMethod == null) continue; // 获取对应的字段(Field) Field field = null; try { field = entity.getClass().getDeclaredField(pd.getName()); } catch (NoSuchFieldException e) { continue; // 如果找不到字段,跳过 } // 检查是否有@Column注解 Column columnAnnotation = field.getAnnotation(Column.class); String key; if (columnAnnotation != null) { key = columnAnnotation.name(); // 使用列名作为键 } else { key = pd.getName(); // 如果没有注解,使用属性名 } Object value = readMethod.invoke(entity); // 判断是否为有效值 if (value == null) continue; if (value instanceof String && ((String) value).trim().isEmpty()) continue; paramMap.put(key, value); } } catch (Exception e) { throw new RuntimeException(e); } return paramMap; } /** * 类型转换工具 */ private static Object convertValue(Object value, Class<?> targetType) { if (value == null) { if (targetType == String.class) { return ""; } else if (targetType == Integer.TYPE || targetType == Integer.class) { return 0; } else if (targetType == Boolean.TYPE || targetType == Boolean.class) { return false; } return null; } if (targetType == String.class) { return FormatUtils.parseString(value); } else if (targetType == Integer.TYPE || targetType == Integer.class) { return FormatUtils.parseInteger(value); } return value; } /** * 将属性名转换为数据库列名 */ private static String toColumnName(String propertyName) { if (propertyName == null || propertyName.isEmpty()) { return propertyName; } return propertyName; } public static String getTableName(Class<?> entityType) { Table table = entityType.getAnnotation(Table.class); if (table != null) { return table.name(); } return entityType.getSimpleName().toLowerCase() + "s"; } public static List<String> getColumnNames(Class<?> entityType) { try { PropertyDescriptor[] pds = Introspector.getBeanInfo(entityType).getPropertyDescriptors(); return Arrays.stream(pds) .filter(pd -> !"class".equals(pd.getName())) .map(pd -> toColumnName(pd.getName())) .collect(Collectors.toList()); } catch (IntrospectionException e) { throw new RuntimeException(e); } } public static List<String> getPrimaryKeys(Class<?> entityType) { List<String> keys = new ArrayList<>(); for (Field field : entityType.getDeclaredFields()) { if (field.isAnnotationPresent(Id.class)) { // 检查 @Id 注解 Column column = field.getAnnotation(Column.class); String columnName = column != null && !column.name().isEmpty() ? column.name() : toColumnName(field.getName()); keys.add(columnName); } } return keys; } /** * 生成INSERT语句 */ public static String buildInsertSql(Class<?> entityType) { String tableName = getTableName(entityType); List<String> columns = getColumnNames(entityType); String columnsStr = String.join(", ", columns); String paramsStr = columns.stream().map(c -> ":" + c).collect(Collectors.joining(", ")); return String.format("INSERT INTO %s (%s) VALUES (%s)", tableName, columnsStr, paramsStr); } /** * 生成UPDATE语句 */ public static String buildUpdateSql(Class<?> entityType) { String tableName = getTableName(entityType); List<String> columns = getColumnNames(entityType); List<String> primaryKeys = getPrimaryKeys(entityType); // 过滤掉主键字段,仅保留非主键字段在 SET 子句 List<String> nonPrimaryKeyColumns = columns.stream() .filter(c -> !primaryKeys.contains(c)) .collect(Collectors.toList()); String setClause = nonPrimaryKeyColumns.stream() .map(c -> c + " = :" + c) .collect(Collectors.joining(", ")); String whereClause = primaryKeys.stream() .map(c -> c + " = :" + c) .collect(Collectors.joining(" AND ")); return String.format("UPDATE %s SET %s WHERE %s", tableName, setClause, whereClause); } /** * 生成DELETE语句 */ public static String buildDeleteSql(Class<?> entityType) { String tableName = getTableName(entityType); List<String> primaryKeys = getPrimaryKeys(entityType); List<String> whereClauses = primaryKeys.stream().map(c -> c + " = :" + c).collect(Collectors.toList()); String whereClause = String.join(" AND ", whereClauses); return String.format("DELETE FROM %s WHERE %s", tableName, whereClause); } /** * 生成基础SELECT语句 */ public static String buildSelectSql(Class<?> entityType) { String tableName = getTableName(entityType); List<String> columns = getColumnNames(entityType); String columnsStr = String.join(", ", columns); return String.format("SELECT %s FROM %s", columnsStr, tableName); } /** * 生成带WHERE条件的COUNT语句 */ public static String buildCountSql(Class<?> entityType, String whereClause) { return String.format("SELECT COUNT(*) FROM %s WHERE %s", getTableName(entityType), whereClause); } /** * 生成分页SQL */ public static String buildPagedSql(String innerSql) { return String.format( "SELECT t.* FROM (SELECT rownum row_num, t.* FROM (%s) t WHERE rownum <= :END_INDEX) t WHERE t.row_num >= :START_INDEX", innerSql ); } /** * 根据实体对象生成WHERE条件 */ public static String buildWhereClause(Class<?> entityType, Object entity) { try { PropertyDescriptor[] pds = Introspector.getBeanInfo(entityType).getPropertyDescriptors(); List<String> conditions = Arrays.stream(pds) .filter(pd -> !"class".equals(pd.getName())) .map(pd -> { String propertyName = pd.getName(); try { // 获取字段并检查@Column注解 Field field = entityType.getDeclaredField(propertyName); Column column = field.getAnnotation(Column.class); String columnName = column != null ? column.name() : toColumnName(propertyName); // 获取属性值并判断是否有效 Object value = pd.getReadMethod().invoke(entity); if (value == null) return null; if (value instanceof String && ((String) value).trim().isEmpty()) return null; // 生成条件表达式 return columnName + " = :" + columnName; } catch (NoSuchFieldException | IllegalAccessException | InvocationTargetException e) { return null; } }) .filter(Objects::nonNull) .collect(Collectors.toList()); // 拼接最终的WHERE条件 return conditions.isEmpty() ? "1=1" : "1=1 AND " + String.join(" AND ", conditions); } catch (Exception e) { throw new RuntimeException("Failed to build where clause", e); } } /** * 通用方法:去除对象中所有 String 类型字段的左右空格和换行符 * * @param obj 待处理的对象 */ public static void objectTrim(Object obj) { if (obj == null) { return; } Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.getType() == String.class) { field.setAccessible(true); try { String value = (String) field.get(obj); if (value != null) { // 使用正则去除左右空格和换行符 String cleaned = value.replaceAll("^\\s+|\\s+$", ""); field.set(obj, cleaned); } } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } getColumnNames现在是固定生成字段,而不是根据toParamMap一样是动态根据是否有值来生成字段,这样会导致生成的SQL与实际赋值不一致 String sql = BeanMapper.buildInsertSql(hbmMaterialHist.getClass()); Map<String, Object> param = BeanMapper.toParamMap(hbmMaterialHist); try { commonSQLDao.updateSQL(sql, param, Database.DS_TYS_NAME); return true; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); throw new MaterialManageException("操作失败!" + e.getMessage()); } 需要修改一下getColumnNames
09-11
package com.example.kucun2.DataPreserver; import android.util.Log; import com.example.kucun2.entity.data.SynchronizableEntity; import com.example.kucun2.entity.data.SynchronizedList; import com.example.kucun2.entity.RefTo; import com.example.kucun2.entity.RefType; import java.lang.reflect.Field; import java.util.*; /** * 实体关联处理器 * * 功能:自动处理实体间的引用关系,包括: * 1. 正向引用(实体对其他实体的引用) * 2. 反向引用(其他实体对当前实体的引用) * 3. 双向关联(自动维护双向引用关系) */ public class DataAssociator { private final DataStore dataStore; // 反向映射缓存 [目标实体类 -> [反向字段名 -> 源实体类]] private final Map<Class<?>, Map<String, Class<?>>> reverseMappingCache = new HashMap<>(); // 实体ID映射缓存 [实体类 -> [实体ID -> 实体实例]] private final Map<Class<?>, Map<Integer, SynchronizableEntity>> idMapCache = new HashMap<>(); private static final String TAG="DataAssociator"; public DataAssociator(DataStore dataStore) { this.dataStore = dataStore; buildReverseMappingCache(); buildIdMapCache(); } /** * 构建反向映射缓存(系统启动时执行一次) * 扫描所有实体类,缓存双向关联的元数据 */ private void buildReverseMappingCache() { for (Class<?> entityClass : dataStore.dataCollectionMap.keySet()) { for (Field field : getAllFields(entityClass)) { RefTo refAnnotation = field.getAnnotation(RefTo.class); if (refAnnotation != null && refAnnotation.bidirectional()) { Class<?> targetClass = refAnnotation.target(); String reverseField = refAnnotation.reverseField(); reverseMappingCache .computeIfAbsent(targetClass, k -> new HashMap<>()) .put(reverseField, entityClass); } } } } /** * 构建ID映射缓存(每次数据加载后更新) * 创建实体ID到实体实例的快速查找映射 */ private void buildIdMapCache() { idMapCache.clear(); for (Class<?> entityClass : dataStore.dataCollectionMap.keySet()) { SynchronizedList<?> list = dataStore.getCollection(entityClass); if (list == null) continue; Map<Integer, SynchronizableEntity> idMap = new HashMap<>(); for (Object entity : list.getViewList()) { SynchronizableEntity syncEntity = (SynchronizableEntity) entity; idMap.put(syncEntity.getId(), syncEntity); } idMapCache.put(entityClass, idMap); } } /** * 自动处理所有实体关联关系 * 建议在数据加载完成后调用 */ public void automaticAssociation() { Log.d("DataAssociator", "开始处理实体关联..."); long startTime = System.currentTimeMillis(); // 1. 构建ID映射缓存 buildIdMapCache(); // 2. 处理所有正向引用 for (SynchronizedList<?> list : dataStore.dataCollectionMap.values()) { for (Object entity : list.getViewList()) { processForwardReferences((SynchronizableEntity) entity); } } // 3. 处理所有反向引用 for (SynchronizedList<?> list : dataStore.dataCollectionMap.values()) { for (Object entity : list.getViewList()) { processReverseReferences((SynchronizableEntity) entity); } } // 4. 刷新ID映射缓存 refreshIdMapCache(); long duration = System.currentTimeMillis() - startTime; Log.d("DataAssociator", "实体关联处理完成, 耗时: " + duration + "ms"); } /** * 处理单个实体的正向引用 * 解析带有@RefTo注解的字段,并替换为实际实体引用 */ private void processForwardReferences(SynchronizableEntity entity) { for (Field field : getAllFields(entity.getClass())) { RefTo refAnnotation = field.getAnnotation(RefTo.class); if (refAnnotation == null) continue; try { field.setAccessible(true); Class<?> targetClass = refAnnotation.target(); RefType refType = refAnnotation.type(); if (refType == RefType.SINGLE) { // 处理单实体引用 Object refValue = field.get(entity); if (refValue instanceof SynchronizableEntity) { SynchronizableEntity refEntity = (SynchronizableEntity) refValue; SynchronizableEntity actualEntity = findActualEntity(refEntity, targetClass); // 确保实际对象不为空 if (actualEntity != null) { field.set(entity, actualEntity); // 建立双向关联 if (refAnnotation.bidirectional()) { linkBidirectional(entity, actualEntity, refAnnotation.reverseField()); } } else { Log.w(TAG, "找不到目标实体: " + targetClass.getSimpleName() + " ID: " + refEntity.getId()); } } } // 其他引用类型处理... } catch (Exception e) { Log.e(TAG, "处理引用失败: " + e.getMessage(), e); } } } /** * 处理单个实体的反向引用 * 查找所有引用当前实体的其他实体,并更新其引用 */ private void processReverseReferences(SynchronizableEntity entity) { Class<?> entityClass = entity.getClass(); Map<String, Class<?>> reverseMappings = reverseMappingCache.get(entityClass); if (reverseMappings == null) return; for (Map.Entry<String, Class<?>> entry : reverseMappings.entrySet()) { String reverseFieldName = entry.getKey(); Class<?> sourceClass = entry.getValue(); SynchronizedList<?> sourceList = dataStore.getCollection(sourceClass); if (sourceList == null) continue; for (Object sourceObj : sourceList.getViewList()) { try { updateReverseReference((SynchronizableEntity) sourceObj, reverseFieldName, entity); } catch (Exception e) { Log.e("DataAssociator", "处理反向引用失败: " + e.getMessage()); } } } } /** * 更新单个反向引用 */ private void updateReverseReference(SynchronizableEntity sourceEntity, String reverseFieldName, SynchronizableEntity targetEntity) throws Exception { Field reverseField = sourceEntity.getClass().getDeclaredField(reverseFieldName); reverseField.setAccessible(true); RefTo refAnnotation = reverseField.getAnnotation(RefTo.class); if (refAnnotation == null) return; if (refAnnotation.type() == RefType.SINGLE) { // 更新单值反向引用 SynchronizableEntity currentRef = (SynchronizableEntity) reverseField.get(sourceEntity); if (currentRef != null && currentRef.getId().equals(targetEntity.getId())) { reverseField.set(sourceEntity, targetEntity); } } else if (refAnnotation.type() == RefType.LIST) { // 更新列表反向引用 List<SynchronizableEntity> refList = (List<SynchronizableEntity>) reverseField.get(sourceEntity); if (refList != null) { for (int i = 0; i < refList.size(); i++) { SynchronizableEntity refItem = refList.get(i); if (refItem.getId().equals(targetEntity.getId())) { refList.set(i, targetEntity); } } } } } /** * 建立双向关联 */ private void linkBidirectional(SynchronizableEntity source, SynchronizableEntity target, String reverseFieldName) { try { Field reverseField = target.getClass().getDeclaredField(reverseFieldName); reverseField.setAccessible(true); RefTo refAnnotation = reverseField.getAnnotation(RefTo.class); if (refAnnotation == null) return; if (refAnnotation.type() == RefType.SINGLE) { // 单值关联:直接设置引用 reverseField.set(target, source); } else if (refAnnotation.type() == RefType.LIST) { // 列表关联:添加到引用列表 List<SynchronizableEntity> list = (List<SynchronizableEntity>) reverseField.get(target); if (list == null) { list = new ArrayList<>(); reverseField.set(target, list); } if (!list.contains(source)) { list.add(source); } } } catch (Exception e) { Log.e("DataAssociator", "建立双向关联失败: " + e.getMessage()); } } /** * 查找实际实体(使用ID映射缓存) */ private SynchronizableEntity findActualEntity(SynchronizableEntity refEntity, Class<?> targetClass) { Map<Integer, SynchronizableEntity> idMap = idMapCache.get(targetClass); if (idMap != null) { SynchronizableEntity actualEntity = idMap.get(refEntity.getId()); if (actualEntity != null) { return actualEntity; } } Log.w(TAG, "实体未找到: " + targetClass.getSimpleName() + " ID: " + refEntity.getId()); return refEntity; // 找不到时返回原始引用 } /** * 获取类的所有字段(包括父类) */ private List<Field> getAllFields(Class<?> clazz) { List<Field> fields = new ArrayList<>(); while (clazz != null && clazz != Object.class) { Collections.addAll(fields, clazz.getDeclaredFields()); clazz = clazz.getSuperclass(); } return fields; } /** * 刷新ID映射缓存(数据变更后调用) */ public void refreshIdMapCache() { buildIdMapCache(); } // DataAssociator.java 新增方法 /** * 处理单个实体的依赖关系 * @param entity 需要处理依赖的实体 */ // 修改:移除单个实体处理时的ID缓存刷新 public void processEntityDependencies(SynchronizableEntity entity) { // 只处理该实体的依赖,不刷新全局缓存 processForwardReferences(entity); processReverseReferences(entity); } } js------ //这个函数不许改,也禁止废话,属性名和其他命名都哼规范不会出现意外, function resolveDataReferences(data) { console.log(data) // 获取 data 对象的所有顶层键 const keys = Object.keys(data); // 遍历每个顶层键(如 users, posts 等) for (const key of keys) { const entities = data[key]; // 遍历该顶层键下的每个实体(如每个 user 或 post) for (const entity of entities) { // 遍历实体的每个属性 for (const attribute in entity) { if (entity?.hasOwnProperty(attribute)) { var trpe=attribute?.replace(/\d/g, ''); // 确保属性属于当前实体 if (Array.isArray(entity[attribute])) { if(data[trpe]==null){ trpe+="s" } // 如果属性是一个数组,则将数组中的每个 ID 替换为对应的实际对象 entity[attribute] = entity[attribute].map(item => data[trpe ]?.find(updateItem => updateItem?.id === item?.id) || item ); } else if (typeof entity[attribute] === "object" && entity[attribute] !== null) { // 如果属性是一个对象,则将其替换为对应的实际对象 entity[attribute] = data[trpe + "s"]?.find(updateItem => updateItem?.id === entity[attribute]?.id); } } } } } return data; }------------------根据js逻辑修改DataAssociator类
06-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值