java - 如果实体名称保存在变量中,如何编写 hibernate 插入查询

标签 java mysql spring hibernate entity

在我的应用程序中,我遇到了一种情况,我需要将一些数据保存到实体,但实体名称未知,并且保存在变量和实体字段中,其值在列表中。所以我需要选择变量中的实体名称及其字段和列表中的数据。 变量是xEntity。

public void saveData(String xEntity,List<Attribute> attributeList) {
  // hibernate insert query
}

下面显示了一些实体类,它们可能作为 xEntity 以及函数 saveData() 中的 attributeList 出现。

@Entity
    @Table(name = "person")
    public class Person implements Serializable {
        @Id
        @GeneratedValue
        @Column(name = "id")
        private Integer id;

        @Column(name = "emp_id")
        private String empId;

        @Column(name = "name")
        private String name;

        @Column(name="dob")
        private Date dob;

        @Column(name="active")
        private Boolean active;

        @Column(name="created_on")
        private Timestamp createdOn;

        public Person() {
        }

        public Person(Integer id, String empId, String name, Date dob, Boolean active, Timestamp createdOn) {
            this.id = id;
            this.empId = empId;
            this.name = name;
            this.dob = dob;
            this.active = active;
            this.createdOn = createdOn;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getEmpId() {
            return empId;
        }

        public void setEmpId(String empId) {
            this.empId = empId;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Date getDob() {
            return dob;
        }

        public void setDob(Date dob) {
            this.dob = dob;
        }

        public Boolean getActive() {
            return active;
        }

        public void setActive(Boolean active) {
            this.active = active;
        }

        public Timestamp getCreatedOn() {
            return createdOn;
        }

        public void setCreatedOn(Timestamp createdOn) {
            this.createdOn = createdOn;
        }
    }


    @Entity
    @Table(name = "person_address")
    public class PersonAddress implements Serializable {
        @Id
        @GeneratedValue
        @Column(name = "id")
        private Integer id;

        @Column(name = "emp_id")
        private String empId;

        @Column(name = "house_name")
        private String houseName;

        @Column(name="post_office")
        private String postOffice;

        @Column(name="district")
        private String district;

        @Column(name="state")
        private String state;

        @Column(name="active")
        private Boolean active;

        @Column(name="created_on")
        private Timestamp createdOn;

        public PersonAddress() {
        }

        public PersonAddress(Integer id, String empId, String houseName, String postOffice, String district, String state, Boolean active, Timestamp createdOn) {
            this.id = id;
            this.empId = empId;
            this.houseName = houseName;
            this.postOffice = postOffice;
            this.district = district;
            this.state = state;
            this.active = active;
            this.createdOn = createdOn;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getEmpId() {
            return empId;
        }

        public void setEmpId(String empId) {
            this.empId = empId;
        }

        public String getHouseName() {
            return houseName;
        }

        public void setHouseName(String houseName) {
            this.houseName = houseName;
        }

        public String getPostOffice() {
            return postOffice;
        }

        public void setPostOffice(String postOffice) {
            this.postOffice = postOffice;
        }

        public String getDistrict() {
            return district;
        }

        public void setDistrict(String district) {
            this.district = district;
        }

        public void setState(String state) {
            this.state = state;
        }

        public Boolean getActive() {
            return active;
        }

        public void setActive(Boolean active) {
            this.active = active;
        }

        public Timestamp getCreatedOn() {
            return createdOn;
        }

        public void setCreatedOn(Timestamp createdOn) {
            this.createdOn = createdOn;
        }
    }


    @Entity
    @Table(name = "person_qualification")
    public class PersonQualification implements Serializable {
        @Id
        @GeneratedValue
        @Column(name = "id")
        private Integer id;

        @Column(name = "emp_id")
        private String empId;

        @Column(name = "degree")
        private String degree;

        @Column(name="grade")
        private String grade;

        @Column(name="active")
        private Boolean active;

        @Column(name="created_on")
        private Timestamp createdOn;

        public PersonQualification() {
        }

        public PersonQualification(Integer id, String empId, String degree, String grade, Boolean active, Timestamp createdOn) {
            this.id = id;
            this.empId = empId;
            this.degree = degree;
            this.grade = grade;
            this.active = active;
            this.createdOn = createdOn;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getEmpId() {
            return empId;
        }

        public void setEmpId(String empId) {
            this.empId = empId;
        }

        public String getDegree() {
            return degree;
        }

        public void setDegree(String degree) {
            this.degree = degree;
        }

        public String getGrade() {
            return grade;
        }

        public void setGrade(String grade) {
            this.grade = grade;
        }

        public Boolean getActive() {
            return active;
        }

        public void setActive(Boolean active) {
            this.active = active;
        }

        public Timestamp getCreatedOn() {
            return createdOn;
        }

        public void setCreatedOn(Timestamp createdOn) {
            this.createdOn = createdOn;
        }
    }       

下面是每次可能出现在 attributeList 中的一些值。

    attributeList = [{"fieldName":"empId","value":"EMP_123"},{"fieldName":"name","value":"Basil"},{"fieldName":"dob","value":"26-11-90"}]

    attributeList = [{"fieldName":"empId","value":"EMP_123"},{"fieldName":"houseName","value":"Ellikkal"},{"fieldName":"postOffice","value":"Chengara"},{"fieldName":"district","value":"Alappy"},{"fieldName":"state","value":"Kerala"}]

    attributeList = [{"fieldName":"empId","value":"EMP_123"},{"fieldName":"degree","value":"B.Tech"},{"fieldName":"grade","value":"First class"}]

日期值作为字符串日期,应格式化为日期类型。下面是属性类。

        public class Attribute implements Serializable {
        private String fieldName;
        private String value;

        public Attribute() {
            super();
            // TODO Auto-generated constructor stub
        }

        public Attribute(String fieldName, String value) {
            this.fieldName = fieldName;
            this.value = value;
        }

        public String getFieldName() {
            return fieldName;
        }

        public void setFieldName(String fieldName) {
            this.fieldName = fieldName;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }

    }

现在我可以使用 hibernate 查询将数据保存到每个实体吗?如果有人知道请帮助我。

最佳答案

虽然我不知道你为什么要这样做,但如果你别无选择,那么你必须在这里使用反射。

首先使用您的类名创建实例。它应该是完整的类名。此外,您的类应该有默认构造函数。

Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor();
Object object = ctor.newInstance();

现在使用反射来设置字段的值。假设您的字段名称存储在 fieldName 中,值存储在 fieldValue 中

declaredField = object.getClass().getDeclaredField(fieldName);
declaredField.setAccessible(true);
declaredField.set(object, fieldValue);

对于需要将类型从字符串转换为日期等的情况,您必须获取字段类型并进行相应的转换。字段类型可以通过以下方式找到:

declaredField.getFieldType();

现在使用 hibernate 保存该对象。

sessionFactory.getCurrentSession().save(object);

关于java - 如果实体名称保存在变量中,如何编写 hibernate 插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46954534/

相关文章:

MySQL查询查找最后插入的代码

java - 使用 Spring Batch 读取 XML 并写入数据库

java - 跟踪谁在微服务中创建或更改了实体

子类中的 Java 泛型和有界参数

mysql - 查找可用日期

java - 动态绘图

mysql - SQL- 将列中的值相加

java - not-null 属性引用 null 或 transient 值 : com. project.test.entity.Stamp.createdAt

java - 何时使用 LinkedListNode 与 LinkedList

java - 我们可以使用 JUNIT 进行自动化集成测试吗?