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 :
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
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=""Game""> <cache usage="read-write" /> <id name="id" column=""id"" 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=""currentPlayerId"" /> </many-to-one> <set name="players" cascade="delete" lazy="true" inverse="true"> <key column=""gameId"" /> <one-to-many class="be.asterius.model.Player" /> </set> </class> </hibernate-mapping> <hibernate-mapping default-lazy="true"> <class name="be.asterius.model.User" table=""UserAccount""> <cache usage="read-write" /> <id name="id" column=""id"" 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=""userId"" /> <one-to-many class="be.asterius.model.Player" /> </set> </class> </hibernate-mapping> <hibernate-mapping default-lazy="true"> <class name="be.asterius.model.Player" table=""Player""> <cache usage="read-write" /> <id name="id" column=""id"" 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=""userId"" /> </many-to-one> <many-to-one name="game" class="be.asterius.model.Game" lazy="proxy" cascade="none"> <column name=""gameId"" /> </many-to-one> </class> </hibernate-mapping>
Et voici le genre d'erreur que j'obtiens
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);
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.
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".
Ma question donc : comment faire en sorte que Hibernate mette cette valeur à null automatiquement?
Merci d'avance pour vos réponses,
Asterius
Partager