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 : Sélectionner tout - Visualiser dans une fenêtre à part
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à :

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 : Sélectionner tout - Visualiser dans une fenêtre à part
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