Java HIbernate@DynamicUpdate不与JPA Entitymanager一起工作
我试图更新一个实体,但当我调用EntityManager.merge()时,它正在更新表中的所有列。但我的要求是只更新那些被修改的列。我在互联网上搜索了stack overflow,得到的解决方案是使用@SelectBeforeUpdate和@DynamicUpdate。我尝试了这些注释,但不起作用。当我尝试更新某些特定列时,所有其他列也会更新 实体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
@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();
}