簡體   English   中英

休眠-如何使用外鍵

[英]Hibernate - How to do with foreign key

我在使用外鍵和休眠時遇到一些困難。

我正在使用Spring 4和Hibernate5。我有兩個mysql表,Utilisateur和Adresse。

對我來說,一個用戶有一個地址,一個地址有一個用戶。 所以,這是一對一的關系(如果我做錯了,請糾正我:))。 因此,我這樣做:

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

但是,當我啟動主程序時,會出現以下異常:

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

這是我的主要:

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

你有想法嗎?

我認為這是雙向關系,請嘗試:在Adresse類中:

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

在Utilisateur類中:

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

看到這個鏈接

是的,這是我的兩節課(無進口):

@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;
    }


}

地址:

@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;
    }

}

在SQL請求中:

從utilisateur u中選擇*,在其中找到u.id = a.idUtilisateur

= d

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM