Bonjour,
J'ai une entité qui a une dépendance @ManyToOne vers une autre entité (c'est une table d'historique):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
@Entity
@Table(name = "MY_TABLE_HISTORY")
public class MyTableHistoryEntity implements Serializable {
 
    ...
 
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "MY_TABLE_ID")
    private MyTableEntity myTable;
 
    ....
}
J'ai une méthode transactionnée avec un try/catch dans laquelle je logue une erreur dans l'historique en cas d'exception:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
@Transactional
public MyResponse myService(MyRequest request) throws Exception {
    try {
        // récupération de l'entité de dépendance (MyTableEntity)
        // mise à jour de cette entité
    } catch(Exception exc) {
        // en cas d'exception lors de la mise à jour, on créé une MyTableHistoryEntity qui a une dépendance vers MyTableEntity et on rethrow l'exception
        MyTableHistoryEntity history = new MyTableHistoryEntity();
        ...
        history.setMyTable(...);
    }
}
Le problème est que quand j'ai une exception et que je créé l'entité MyTableHistoryEntity, il met aussi à jour MyTableEntity vu qu'il y a une dépendance alors que je voudrais un revert sur ces modifications (normallement géré à la sortie de la méthode transactionnée) et seulement sauvegarder une trace de l'erreur dans l'historique.

Hibernate fait un INSERT pour la ligne dans l'historique mais met aussi à jour (UPDATE) l'entité associée avec les modifications contenues dans l'instance de MyTableEntity.

En gros, il faudrait soit que je puisse dire à hibernate de ne pas mettre à jour cette dépendance si elle est modifiée ou bien que quand je créé l'entité MyTableHistoryEntity, je puisse l'associer à l'entité initiale de MyTableEntity et non celle modifiée mais même si je refais un findOne(Long id) au moment de créer l'entité MyTableHistoryEntity, il me renvoie la même instance de l'entité et donc celle modifiée plutôt qu'une nouvelle non modifiée.

Voyez-vous comment faire svp?

Edit: J'ai trouvé. Dans mon catch j'appelle la method refresh de l'EntityManager pour qu'il écrase les modifications par les données en base. Ainsi, je retrouve bien mon objet initial et hibernate ne fait donc pas d'update (juste l'insert dans l'historique).