J'ai 2 entités JPA cartographié comme ceci:Mise en veille prolongée 5 bytecode Amélioration Association de gestion fonctionne dans une direction
@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;
}
}
Toutes les classes sont bytecode amélioré à l'aide d'améliorer hibernate plugin Maven:
<build>
<plugins>
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<version>5.2.2.Final</version>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.2.Final</version>
</dependency>
</dependencies>
<configuration>
<enableDirtyTracking>true</enableDirtyTracking>
<enableLazyInitialization>true</enableLazyInitialization>
<enableAssociationManagement>true</enableAssociationManagement>
</configuration>
</plugin>
</plugins>
</build>
J'effectue deux tests afin de vérifier que les classes améliorées fonctionnent correctement:
@Test
public void test1() {
Department department = new Department();
Employee employee = new Employee();
department.getEmployees().add(employee);
assertThat(employee.getDepartment(), is(not(nullValue())));
}
@Test
public void test2() {
Department department = new Department();
Employee employee = new Employee();
employee.setDepartment(department);
assertThat(department.getEmployees().size(), is(1));
assertThat(department.getEmployees().get(0), is(employee));
}
Seul le second test passe avec succès, par conséquent tandis que l'association est manipulée par la collection des parents, le champ de parent de l'enfant ne sont pas mis à jour, alors que dans Hibernate ORM 5.2.3.Final User Guide est dit
gestion de l'association bidirectionnelle bytecode améliorée fait que le premier travail d'exemple en gérant "l'autre côté" d'une association bidirectionnelle chaque fois qu'un côté est manipulé.
Où référencé "premier exemple" est
Exemple d'utilisation 204. Java normale incorrecte
Pourquoi dans mon cas test1 la gestion de l'association ne fonctionne pas? Qu'ai-je fait de mal?
J'ai essayé d'utiliser la méthode simple main(), pas par des tests. Le comportement est le même. –
De plus, si les classes n'ont pas été améliorées, le second test ne réussira pas. Donc, ils sont améliorés, parce que quand j'inspecte des objets, ils ont des champs spécifiques de suivi de code d'octet ** –
Bon à savoir. Dans ce cas, ouvrez un problème Jira et joignez votre scénario de test. Je ne suis pas sûr si cette fonctionnalité était destinée à l'enfant, donc mieux ouvrir le problème. –