Java Hibernate 5字节码增强关联管理只在一个方向工作
我有两个JPA实体映射如下:Java Hibernate 5字节码增强关联管理只在一个方向工作,java,hibernate,maven,one-to-many,bytecode,Java,Hibernate,Maven,One To Many,Bytecode,我有两个JPA实体映射如下: @MappedSuperclass public class AbstractEntity { private static final String INCREMENT_STRATEGY = "increment"; private static final String INCREMENT_ID_GENERATOR_NAME = "INCREMENT_ID_GENERATOR"; @I
@MappedSuperclass
public class AbstractEntity {
private static final String INCREMENT_STRATEGY = "increment";
private static final String INCREMENT_ID_GENERATOR_NAME = "INCREMENT_ID_GENERATOR";
@Id
@GenericGenerator(name = INCREMENT_ID_GENERATOR_NAME, strategy = INCREMENT_STRATEGY)
@GeneratedValue(generator = INCREMENT_ID_GENERATOR_NAME)
private Long id;
public AbstractEntity() {
super();
}
public Long getId() {
return id;
}
}
@Entity
public class Department extends AbstractEntity{
@OneToMany(cascade = CascadeType.ALL, mappedBy = "department")
private List<Employee> employees = new ArrayList<Employee>();
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
public List<Employee> getEmployees() {
return employees;
}
}
@Entity
public class Employee extends AbstractEntity {
@ManyToOne(optional = true, cascade= CascadeType.ALL)
@JoinColumn(name = "DEPARTMENT_ID")
private Department department;
public void setDepartment(Department department) {
this.department = department;
}
public Department getDepartment() {
return department;
}
}
只有第二个测试成功通过,因此当通过父集合操纵关联时,子项的父字段不会更新,而
字节码增强的双向关联管理使第一个示例能够通过管理双向关联的“另一方”来工作,只要一方被操纵
引用的“第一个示例”是
例204。不正确的正常Java用法
为什么在我的test1案例中,关联管理不起作用?我做错了什么?在单元测试中,类可能没有得到增强,特别是在通过IDE运行它们时 确保增强的类包含在执行测试的项目中导入的不同模块中 或者您可以运行增强过程,验证类是否增强,然后才运行单元测试 总而言之,我猜您可能正在运行实体类的未增强版本
不管怎么说,我认为这个功能不是真的必要,它只需要您提供addChild和removeChild方法。追踪Andrei的JIRA问题我了解到: 要触发关联管理,在某个时候必须有一个 *ToMany字段中的更改,即使它与同一个集合相同。 不会跟踪集合本身的更改 因此,不是:
customer.getInventories().add( customerInventory );
需要调用setter:
Collection<CustumerInventory> inventories = customer.getInventories();
inventories.add( customerInventory );
custumer.setInventories( inventories );
Collection inventories=customer.getInventories();
存货。添加(客户存货);
客户设置存货(存货);
我尝试过使用simple main()方法,而不是通过测试。行为是一样的。而且,如果没有对类进行增强,第二次测试将不会成功通过。所以它们得到了增强,因为当我检查对象时,它们有特定的字节码跟踪字段。在这种情况下,打开Jira问题并附加测试用例。我不确定这项功能是否是为儿童设计的,所以最好打开这个问题。我想是的,因为在《用户指南》中定义的正是在我的测试中失败的场景。我会打开吉拉的问题。谢谢你的快速回答:)@vladmin你能详细解释一下为什么你从来没有推广字节码增强功能吗?我无法在你的书或博客中找到解释。我认为双向关联管理非常有用,因为它允许我编写/维护更少的代码。这可能是一个类似于编写getter/setter或使用lombok的讨论。如果我上面引用的Louis的帖子不正确,那么Andrei的Jira问题就在这里,请告诉我。
customer.getInventories().add( customerInventory );
Collection<CustumerInventory> inventories = customer.getInventories();
inventories.add( customerInventory );
custumer.setInventories( inventories );