Comment gérer les clefs étrangères ?
Bonjour à tous =D,
j'ai une petite difficulté à comprendre la gestion des clefs étrangères avec Hibernate.
J'utilise Spring ORM 4 et Hibernate 5. J'ai deux tables MySQL, Utilisateur et Adresse.
Pour moi, un utilisateur a une adresse et vice versa. Donc c'est une relation 1-1 (corrigez moi si je me trompe) et donc je dois utiliser l'annotation One-to-one.
J'ai donc un idUtilisateur dans ma classe Adresse qui fait référence à l'id de la table Utilisateur. :
Code:
1 2 3 4 5
| @OneToOne
@JoinColumn(name="id")
public Utilisateur getIdUtilisateur() {
return idUtilisateur;
} |
Pourtant lorsque je lance mon main pour tester j'ai ces erreurs là :
Citation:
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute statement
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2921)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3421)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1295)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:468)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3135)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2352)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
at com.ecollection.dao.AdresseDaoImpl.creerAdresse(AdresseDaoImpl.java:30)
at com.ecollection.service.AdresseServiceImpl.creerAdresse(AdresseServiceImpl.java:26)
at TestMain.main(TestMain.java:39)
Caused by: java.sql.SQLException: Field 'idUtilisateur' doesn't have a default value
En sachant que j'ai ce petit bout de code dans mon main :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
UtilisateurServiceImpl utilisateurService = new UtilisateurServiceImpl();
Utilisateur utilisateur = new Utilisateur("Valjeant", "Jean");
utilisateurService.creerUtilisateur(utilisateur);
AdresseServiceImpl adresseService = new AdresseServiceImpl();
Adresse nouvelleAdresse = new Adresse("avenue du champagne", "51100", "reims", "france", utilisateur);
adresseService.creerAdresse(nouvelleAdresse); |
Avez-vous une idée ?
Merci d'avance =D