Bonjour,

J'ai un petit cas d'école qui me donne des cheveux blancs, peux-être que vous saurez comment m'aider. Voici le contexte :
J'ai trois entités : User, Game et Player: User <--->> Player <<--> Game
Particularité : Game possède un lien to-one vers player indiquant le joueur courant.

Supposons une partie et un utilisateur créés. On crée un joueur liant les deux, qu'on affecte comme joueur courant.

Problématique : Je souhaite maintenant supprimer cet utilisateur, et le joueur associé en cascade, mais garder la partie intacte. Et donc, il faudrait que le joueur courant soit remis à null dans ma partie. J'aimerai que tout ceci soit définit juste via la configuration Hibernate. Possible? Jusqu'ici, je n'y arrive pas...

Voici mes fichiers de mapping :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<hibernate-mapping default-lazy="true">
    <class name="be.asterius.model.Game" table="&quot;Game&quot;">
        <cache usage="read-write" />
        <id name="id" column="&quot;id&quot;" type="java.lang.Long">
            <generator class="sequence">
                <param name="sequence">game_id_sequence</param>
            </generator>
        </id>
        <many-to-one name="currentPlayer" class="be.asterius.model.Player" lazy="proxy" cascade="none">
            <column name="&quot;currentPlayerId&quot;" />
        </many-to-one>
        <set name="players" cascade="delete" lazy="true" inverse="true">
            <key column="&quot;gameId&quot;" />
            <one-to-many class="be.asterius.model.Player" />
        </set>
    </class>
</hibernate-mapping>
 
<hibernate-mapping default-lazy="true">
    <class name="be.asterius.model.User" table="&quot;UserAccount&quot;">
        <cache usage="read-write" />
        <id name="id" column="&quot;id&quot;" type="java.lang.Long">
            <generator class="sequence">
                <param name="sequence">useraccount_id_sequence</param>
            </generator>
        </id>
        <set name="players" cascade="delete" lazy="true" inverse="true">
            <key column="&quot;userId&quot;" />
            <one-to-many class="be.asterius.model.Player" />
        </set>
    </class>
</hibernate-mapping>
 
<hibernate-mapping default-lazy="true">
    <class name="be.asterius.model.Player" table="&quot;Player&quot;">
        <cache usage="read-write" />
        <id name="id" column="&quot;id&quot;" type="java.lang.Long">
            <generator class="sequence">
                <param name="sequence">player_id_sequence</param>
            </generator>
        </id>
        <many-to-one name="user" class="be.asterius.model.User" lazy="proxy" cascade="none">
            <column name="&quot;userId&quot;" />
        </many-to-one>
        <many-to-one name="game" class="be.asterius.model.Game" lazy="proxy" cascade="none">
            <column name="&quot;gameId&quot;" />
        </many-to-one>
    </class>
</hibernate-mapping>
Voici un exemple de code a exécuter

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Game game = new Game();
getHibernateTemplate().save(game);
 
User user = new User();
getHibernateTemplate().save(user);
 
Player player = new Player();
player.setGame(game);
player.setUser(user);
getHibernateTemplate().save(player);
 
game.getPlayers().add(player);
game.setCurrentPlayer(player);
getHibernateTemplate().merge(game);
 
getHibernateTemplate().delete(user);
Et voici le genre d'erreur que j'obtiens
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
6552 [main] ERROR org.hibernate.util.JDBCExceptionReporter - L'élément du batch 0 /* delete be.asterius.model.Player */ delete from "Player" where "id"=1 a été annulé. Appeler getNextException pour en connaître la cause.
6552 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 23503
6552 [main] ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: update or delete on table "Player" violates foreign key constraint "fk21c01226a19d1e" on table "Game"
  Détail : Key (id)=(1) is still referenced from table "Game".
Cette erreur est assez claire, c'est la contrainte d'intégrité qui lève l'exception parce que la partie référence current player.
Ma question donc : comment faire en sorte que Hibernate mette cette valeur à null automatiquement?

Merci d'avance pour vos réponses,

Asterius