Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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 5字节码增强关联管理只在一个方向工作_Java_Hibernate_Maven_One To Many_Bytecode - Fatal编程技术网

Java Hibernate 5字节码增强关联管理只在一个方向工作

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

我有两个JPA实体映射如下:

@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 );