Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HIbernate@DynamicUpdate不与JPA Entitymanager一起工作_Java_Hibernate_Jpa - Fatal编程技术网

Java HIbernate@DynamicUpdate不与JPA Entitymanager一起工作

Java HIbernate@DynamicUpdate不与JPA Entitymanager一起工作,java,hibernate,jpa,Java,Hibernate,Jpa,我试图更新一个实体,但当我调用EntityManager.merge()时,它正在更新表中的所有列。但我的要求是只更新那些被修改的列。我在互联网上搜索了stack overflow,得到的解决方案是使用@SelectBeforeUpdate和@DynamicUpdate。我尝试了这些注释,但不起作用。当我尝试更新某些特定列时,所有其他列也会更新 实体 @Entity @SelectBeforeUpdate(value=true) @DynamicUpdate(value=true) @Dynam

我试图更新一个实体,但当我调用EntityManager.merge()时,它正在更新表中的所有列。但我的要求是只更新那些被修改的列。我在互联网上搜索了stack overflow,得到的解决方案是使用@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部分犯了一个小错误,当EntityManager通过ID找到任何对象时,您必须使用新的Employee对象

Employee employee = manager.find(Employee.class,emp.getID());
请记住,您必须检查并合并此employee对象,而不是emp

现在的解决方案是相互检查Employee对象(即emp和Employee)的字段/属性值,如果Employee字段值不匹配,则更改其字段值并将其合并。您可以使用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();
}
logger.debug(“更新方法dao:”);
Employee emp=form.getEmployee();
Employee=manager.find(Employee.class,emp.getID());
字段[]empField=emp.getClass().getDeclaredFields();
字段[]employeeField=employee.getClass().getDeclaredFields();
for(int i=0;i

希望这会有帮助

检查这些链接我已经尝试了所有需要字节码增强的解决方案,就像其他JPA提供商提供的现成解决方案一样。
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();
}