简体   繁体   中英

Hibernate - How to do with foreign key

I have some difficulties with foreign key and hibernate.

I'm using Spring 4 and Hibernate 5. I have two mysql table, Utilisateur and Adresse.

For me, one user have one address and one address have one user. SO, this is a One-to-one relation (correct me if I make a mistake :) ). So, I did this:

@OneToOne
@JoinColumn(name="id")
public Utilisateur getIdUtilisateur() {
    return idUtilisateur;
}

However, when I launch my main, I have these exception :

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

This is my main :

    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);

Do you have an idea?

I assume it's bidirectional relationship, try: in Adresse class:

@OneToOne(fetch = FetchType.LAZY, mappedBy = "adresse", cascade = CascadeType.ALL)
public get getUtilisateur() {
        return this.idUtilisateur;
}

in Utilisateur class:

@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
public Adresse getGetAdresse() {
    return this.adresse;
}

See this link

Yes, this is my two classes (without imports) :

@Entity
@Table(name="UTILISATEUR")
public class Utilisateur {

    public Long id;

    public String nom;
    public String prenom;

    public Utilisateur() {
        super();
    }

    public Utilisateur(String nom, String prenom) {
        super();
        this.nom = nom;
        this.prenom = prenom;
    }

    @Override
    public String toString() {
        return "Utilisateur [id=" + id + ", nom=" + nom + ", prenom=" + prenom  + "]";
    }

    @Id
    @Column(name="id")
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment",strategy="increment")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getPrenom() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }


}

Adresse :

@Entity
@Table(name="ADRESSE")
public class Adresse {

    private Long id;

    private String rue;
    private String codePostal;
    private String ville;
    private String pays;

    private Utilisateur idUtilisateur;

    @Override
    public String toString() {
        return ""
                + "Adresse [rue=" 
                + rue 
                + ", codePostal=" 
                + codePostal 
                + ", ville=" 
                + ville 
                + ", pays=" 
                + pays 
                + "]";
    }

    public Adresse() {
    }

    public Adresse(String rue, String codePostal, String ville, String pays) {
        super();
        this.rue = rue;
        this.codePostal = codePostal;
        this.ville = ville;
        this.pays = pays;
    }

    public Adresse(String rue, String codePostal, String ville, String pays, Utilisateur idUtilisateur) {
        super();
        this.rue = rue;
        this.codePostal = codePostal;
        this.ville = ville;
        this.pays = pays;
        this.idUtilisateur = idUtilisateur;
    }

    /*
     * GETTERS/SETTERS
     */

    @Id
    @Column(name="id")
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment",strategy="increment")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return the rue
     */
    public String getRue() {
        return rue;
    }

    /**
     * @param rue the rue to set
     */
    public void setRue(String rue) {
        this.rue = rue;
    }

    /**
     * @return the codePostal
     */
    public String getCodePostal() {
        return codePostal;
    }

    /**
     * @param codePostal the codePostal to set
     */
    public void setCodePostal(String codePostal) {
        this.codePostal = codePostal;
    }

    /**
     * @return the ville
     */
    public String getVille() {
        return ville;
    }

    /**
     * @param ville the ville to set
     */
    public void setVille(String ville) {
        this.ville = ville;
    }

    /**
     * @return the pays
     */
    public String getPays() {
        return pays;
    }

    /**
     * @param pays the pays to set
     */
    public void setPays(String pays) {
        this.pays = pays;
    }

    @OneToOne
    @JoinColumn(name="id")
    public Utilisateur getIdUtilisateur() {
        return idUtilisateur;
    }

    public void setIdUtilisateur(Utilisateur idUtilisateur) {
        this.idUtilisateur = idUtilisateur;
    }

}

In SQL request :

Select * from utilisateur u, adresse a WHERE u.id = a.idUtilisateur

=D

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM