java - HIbernate @DynamicUpdate 不适用于 JPA Entitymanager

标签 java hibernate jpa

我正在尝试更新一个实体,但是当我调用 EntityManager.merge() 时,它正在更新表的所有列。但我的要求是只更新那些被修改的列。我在网上搜索了堆栈溢出,得到的解决方案是使用@SelectBeforeUpdate和@DynamicUpdate。我尝试使用这些注释,但它不起作用。当我尝试更新某些特定列时,所有其他列也会更新。

实体

@Entity
@SelectBeforeUpdate(value=true)
@DynamicUpdate(value=true)
@DynamicInsert(value=true)
@Table(name="Employee")
public class Employee implements Serializable{

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int ID;

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

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

    @Column(name="_contact")
    private Long contact;

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

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

    @Column(name="_joining_date")
    private Date doj;

    @Column(name="_salary")
    private Integer Salary;
}

DAO

    logger.debug("Update method dao :");
    logger.debug(manager.getTransaction());
    Employee emp = form.getEmployee();
    logger.debug(emp);
    manager.find(Employee.class,emp.getID());
    manager.merge(emp);

在调试中它正在更新所有列

最佳答案

据我所知,这不可能以简单的方式实现,我一年前就遇到过这个问题,解决方案是准确的,但唯一的问题是性能(我怀疑)。 首先,您在 dao 部分犯了一些小错误,当 EntityManager 通过 ID 找到任何对象时,您必须使用新的 Employee 对象,即

Employee employee = manager.find(Employee.class,emp.getID());

请记住,您必须检查并合并此员工对象而不是 emp。

现在的解决方案是相互检查 Employee 对象(即 emp 和员工)的字段/属性值,如果员工字段值不匹配,则更改其字段值并将其合并。您可以使用 java 反射,这里是代码

logger.debug("Update method dao :");
Employee emp = form.getEmployee();
Employee employee = manager.find(Employee.class, emp.getID());

Field[] empField = emp.getClass().getDeclaredFields();
Field[] employeeField = employee.getClass().getDeclaredFields();

for (int i = 0; i < empField.length; i++) {
 empField[i].setAccessible(true);
 employeeField[i].setAccessible(true);

 try {
  if (empField[i].get(emp) != null && !empField[i].get(emp).equals(employeeField[i].get(employee))) {
   employeeField[i].set(employee, empField[i].get(emp));
  }
 } catch (IllegalArgumentException e) {
  e.printStackTrace();
 } catch (IllegalAccessException e) {
  e.printStackTrace();
 }

}

employee.setUser(form.getUser());
manager.merge(employee);
manager.flush();
}

希望这会有所帮助!

关于java - HIbernate @DynamicUpdate 不适用于 JPA Entitymanager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43140659/

相关文章:

Java 生成彩虹色 - 怎么样?

java - Flux 不等待 'then' 之前的元素完成

java - jpa 更新/删除查询不起作用

java - hibernate -CDI

google-app-engine - GWT + Appengine + JPA + Eclipse + Maven:如何使它们协同工作

java - @AttributeOverride - 继承一些属性作为默认值

Java:构造函数中的异常:是否有问题?

java - 在 Java 中从 JSON 中删除注释的最快方法?

java - Hibernate 关系注解

eclipse - Hibernate:如何在Hibernate中配置EntityManager?