2016-02-25 111 views
1

我有一些外键和休眠的困难。休眠 - 如何使用外键

我使用Spring 4和Hibernate 5.我有两个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); 

你有一个想法?

+0

根据该跟踪误差,看起来你错过了Utilisateur类的pk代码,或者它没有工作,并且,如果你为这种关系使用级联插入,你介意吗?请在 – Bilguun

回答

1

我认为它是双向的关系,尝试: 在住址类:

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

this link

+0

以下查看我的回答谢谢。在我的数据库中,Utilisateur(英文用户)不知道地址的ID。也许它不是一对一的关系? – Paladice

+1

所以这是一个单向的一对一关系,因为一个Utilisateur类没有关于Adresse类的知识。我可以看看你的班级Utilisateur吗?至少有一部分PK? – Bilguun

+0

是的,请参阅我的回答:) – Paladice

0

是的,这是我的两个类(不进口):

@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 *,住址一个WHERE u.id = a.idUtilisateur

= d