简体   繁体   English

休眠-如何使用外键

[英]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. 我正在使用Spring 4和Hibernate5。我有两个mysql表,Utilisateur和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: 我认为这是双向关系,请尝试:在Adresse类中:

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

in Utilisateur class: 在Utilisateur类中:

@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 : 在SQL请求中:

Select * from utilisateur u, adresse a WHERE u.id = a.idUtilisateur 从utilisateur u中选择*,在其中找到u.id = a.idUtilisateur

=D = d

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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