2014-02-16 89 views
1

當我測試我的項目時,只有4個表在數據庫中創建,但不是其他人,我不知道爲什麼。表notification,position,dernierePositionuser被創建,但沒有創建表demande和其他我沒有放在這個例子中的表。有一些屬性,我忘了? 感謝您的幫助。 這裏有一些文件:休眠表不存在

的hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
             "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory name=""> 
    <!-- Database connection settings, Connect to HSQL, IN Memory --> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/***</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.username">***</property> 
    <property name="hibernate.connection.password"/> 
    <!-- DB schema will be updated if needed --> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <!-- JDBC connection pool (use the built-in) 
List of XML mapping files --> 
    <mapping class="modele.Demande" resource="Demande.hbm.xml"/> 
    <mapping class="modele.DernierePosition" resource="DernierePosition.hbm.xml"/> 
    <mapping class="modele.Group" resource="Group.hbm.xml"/> 
    <mapping class="modele.Invitation" resource="Invitation.hbm.xml"/> 
    <mapping class="modele.Marqueur" resource="Marqueur.hbm.xml"/> 
    <mapping class="modele.Notification" resource="Notification.hbm.xml"/> 
    <mapping class="modele.NotificationMarqueur" resource="NotificationMarqueur.hbm.xml"/> 
    <mapping class="modele.Position" resource="Position.hbm.xml"/> 
    <mapping class="modele.User" resource="User.hbm.xml"/> 
</session-factory> 
</hibernate-configuration> 

Position.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 15 févr. 2014 01:46:28 by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="modele.Position" table="POSITION"> 
     <id name="id" type="int"> 
      <column name="ID" /> 
      <generator class="native" /> 
     </id> 
     <property name="lattitude" type="double"> 
      <column name="LATTITUDE" /> 
     </property> 
     <property name="longitude" type="double"> 
      <column name="LONGITUDE" /> 
     </property> 
    </class> 
</hibernate-mapping> 

DenierePosition.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 15 févr. 2014 01:46:28 by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <joined-subclass name="modele.DernierePosition" extends="modele.Position" table="DERNIEREPOSITION" lazy="false"> 
     <key> 
      <column name="ID" /> 
     </key> 
     <property name="time" type="java.util.Date"> 
      <column name="TIME" /> 
     </property> 
     <one-to-one name="user" class="modele.User"></one-to-one> 
    </joined-subclass> 
</hibernate-mapping> 

Notification.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 15 févr. 2014 01:46:28 by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="modele.Notification" table="NOTIFICATION"> 
     <id name="id" type="int"> 
      <column name="ID" /> 
      <generator class="native" /> 
     </id> 
     <many-to-one name="user" class="modele.User" fetch="join"> 
      <column name="USER" /> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

Demande.java

@XmlRootElement 
public class Demande extends Notification { 

    private Group group; 

    private User demandeur; 

    public Demande(){ 

    } 

    public Demande(Group group, User demandeur) { 
     super(group.getProprietaire()); 
     this.group = group; 
     this.demandeur=demandeur; 
    } 

    // Getters and setters 


} 

Demande.hbm.xml

<?xml version="1.0"?> 
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
    <!-- Generated 15 févr. 2014 01:46:28 by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <joined-subclass name="modele.Demande" extends="modele.Notification" table="DEMANDE" lazy="false"> 
     <key> 
      <column name="ID" /> 
     </key> 
     <many-to-one name="group" class="modele.Group" fetch="join"> 
      <column name="GROUP" /> 
     </many-to-one> 
     <many-to-one name="demandeur" class="modele.User" fetch="join"> 
      <column name="DEMANDEUR" /> 
     </many-to-one> 
    </joined-subclass> 
</hibernate-mapping> 

User.java

@XmlRootElement 
public class User { 

    /** Attributs */ 

    private int id; 

    private String pseudo; 

    private String telephone; 

    private String email; 

    @XmlTransient 
    private Set<Demande> demandes; 

    @XmlTransient 
    private Set<Invitation> aInvite; 

    @XmlTransient 
    private Set<Notification> notifications; 

    private DernierePosition dernierePosition; 

    @XmlTransient 
    private Set<Group> groups; 

    @XmlTransient 
    private Set<Group> proprietaire; 

    /** Constructeur */ 
    public User() { 
    } 

    public User(String telephone, String pseudo, String email) { 
     super(); 
     this.pseudo = pseudo; 
     this.telephone = telephone; 
     this.email = email; 
    } 
// Getters and setters 
} 

User.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 15 févr. 2014 01:46:28 by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="modele.User" table="USER"> 
     <id name="id" type="int"> 
      <column name="ID" /> 
      <generator class="native" /> 
     </id> 
     <property name="pseudo" type="java.lang.String"> 
      <column name="PSEUDO" /> 
     </property> 
     <property name="telephone" type="java.lang.String" not-null="true" unique="true"> 
      <column name="TELEPHONE" /> 
     </property> 
     <property name="email" type="java.lang.String"> 
      <column name="EMAIL" /> 
     </property> 
     <set name="demandes" table="DEMANDE" inverse="false" lazy="true"> 
      <key> 
       <column name="ID" /> 
      </key> 
      <one-to-many class="modele.Demande" /> 
     </set> 
     <set name="aInvite" table="INVITATION" inverse="false" lazy="true" access="field"> 
      <key> 
       <column name="ID" /> 
      </key> 
      <one-to-many class="modele.Invitation" /> 
     </set> 
     <set name="notifications" table="NOTIFICATION" inverse="false" lazy="true"> 
      <key> 
       <column name="ID" /> 
      </key> 
      <one-to-many class="modele.Notification" /> 
     </set> 
     <one-to-one name="dernierePosition" class="modele.DernierePosition"></one-to-one> 
     <set name="groups" table="GROUP" inverse="false" lazy="true"> 
      <key> 
       <column name="ID" /> 
      </key> 
      <one-to-many class="modele.Group" /> 
     </set> 
     <set name="proprietaire" table="GROUP" inverse="false" lazy="true"> 
      <key> 
       <column name="ID" /> 
      </key> 
      <one-to-many class="modele.Group" /> 
     </set> 
    </class> 
</hibernate-mapping> 

Group.java

@XmlRootElement 
public class Group { 

    /** Attributs */ 

    private int id; 

    private String description; 

    private String hashtag; 

    private String password; 

    private Set<Marqueur> marqueurs; 

    @XmlTransient 
    private Set<Invitation> invitations; 

    @XmlTransient 
    private Set<Demande> demandes; 

    private User proprietaire; 

    private Set<User> invites; 

    /** 
    * Constructeur 
    * */ 
    public Group() 
    { 

    } 

    public Group(String description, String hashtag, User proprietaire, String password) { 
     super(); 
     this.description = description; 
     this.hashtag = hashtag; 
     this.proprietaire = proprietaire; 
     this.setPassword(password); 
    } 

Group.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 16 f?vr. 2014 11:30:30 by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="modele.Group" table="GROUP"> 
     <id name="id" type="int"> 
      <column name="ID" /> 
      <generator class="assigned" /> 
     </id> 
     <property name="description" type="java.lang.String"> 
      <column name="DESCRIPTION" /> 
     </property> 
     <property name="hashtag" type="java.lang.String"> 
      <column name="HASHTAG" /> 
     </property> 
     <property name="password" type="java.lang.String"> 
      <column name="PASSWORD" /> 
     </property> 
     <set name="marqueurs" table="MARQUEUR" inverse="false" lazy="true"> 
      <key> 
       <column name="ID" /> 
      </key> 
      <one-to-many class="modele.Marqueur" /> 
     </set> 
     <set name="invitations" table="INVITATION" inverse="false" lazy="true"> 
      <key> 
       <column name="ID" /> 
      </key> 
      <one-to-many class="modele.Invitation" /> 
     </set> 
     <many-to-one name="proprietaire" class="modele.User" fetch="join"> 
      <column name="PROPRIETAIRE" /> 
     </many-to-one> 
     <set name="invites" table="USER" inverse="false" lazy="true"> 
      <key> 
       <column name="ID" /> 
      </key> 
      <one-to-many class="modele.User" /> 
     </set> 
    </class> 
</hibernate-mapping> 

測試用戶

package dao; 

import java.util.List; 

import junit.framework.Assert; 
import modele.User; 

import org.junit.Test; 


public class UserDaoTest { 

    private final String tel = "0601020304"; 
    private final String pseudo = "pseudo"; 
    private final String pseudoModified = "pseudo2"; 
    private final String email = "[email protected]"; 

    @Test 
    public void addUserTest(){ 

     User initialUser = new User(tel, pseudo, email); 

     UserDao.addUser(initialUser); 

     User addedUser = UserDao.getUser(tel); 

     Assert.assertEquals(addedUser.getTelephone(), initialUser.getTelephone()); 
     Assert.assertEquals(addedUser.getPseudo(), initialUser.getPseudo()); 
     Assert.assertEquals(addedUser.getEmail(), initialUser.getEmail()); 
    } 

    @Test 
    public void modifyUserTest(){ 
     UserDao.modifyUser(tel, pseudoModified, email); 

     User modifiedUser = UserDao.getUser(tel); 

     Assert.assertEquals(modifiedUser.getTelephone(), tel); 
     Assert.assertEquals(modifiedUser.getPseudo(), pseudoModified); 
     Assert.assertEquals(modifiedUser.getEmail(), email); 

    } 

    @Test 
    public void listUserTest(){ 
     User modifiedUser = UserDao.getUser(tel); 

     List<User> listUsers = UserDao.listUser(); 

     User listedUser = listUsers.get(listUsers.indexOf(modifiedUser)); 

     Assert.assertEquals(listedUser.getTelephone(), modifiedUser.getTelephone()); 
     Assert.assertEquals(listedUser.getPseudo(), modifiedUser.getPseudo()); 
     Assert.assertEquals(listedUser.getEmail(), modifiedUser.getEmail()); 
    } 

    @Test 
    public void deleteUserTest(){ 
     User user = UserDao.getUser(tel); 

     UserDao.deleteUser(user.getTelephone()); 

     List<User> listUsers = UserDao.listUser(); 

     Assert.assertEquals(listUsers.indexOf(user), -1); 
    } 
} 

回答

2

似乎有許多-to-one和連接子類的問題。詳細解釋如下:the hibernate forums;我並不完全清楚爲什麼它的情況,但從sdknott(在該網站)的解釋是:

您的問題與您的映射。通過聲明多對一的約束列實際上是表A的主鍵列,Hibernate將總是嘗試並解析實體B,因爲多對一列永遠不會爲空。

我用你的源,改變在加盟亞類的各種many-to-one映射one-to-one映射,現在所有的作品對我來說。希望這可以讓你正確地表達你的模式。


(旁白)原來的答覆是沒有解決的問題

我看到你有兩個成員在Demande類稱爲「用戶」;請記住,DemandeNotification的一個子類並獲取其成員。我從來沒有嘗試過,看起來很奇怪,而且肯定會令人困惑。這可能是什麼導致你的問題。

如果你真的想要兩個「用戶」成員,給他們更合適的名字(也許「請求者」和「響應者」?只是從上下文猜測)。如果你只想要一個「用戶」,那麼你不需要把它放在Demande,它已經在Notification

+0

謝謝。我在Demande中刪除了用戶,但沒有任何變化。 Group.xml不會在數據庫中創建表格 –

+0

我把項目放在UTF-8中。現在可以評論févr –

+0

感謝您的幫助。問題是:如果我在任何地方都進行一對一的轉換,那麼這將改變我的模型中的所有內容。在我的程序中,用戶可以有幾個要求,這對一對一的關係來說是不可能的。以及一個用戶可以屬於幾個組,一個組可以包含多個用戶。我將類用戶,需求和組添加到我的代碼中。 –