Hibernate: как сопоставить один ко многим с другой базой данных? - PullRequest
2 голосов
/ 16 ноября 2010

У меня есть 2 класса: пользователь и сообщение.Один пользователь может иметь несколько сообщений.Т.е. это ассоциация один ко многим.Моя таблица пользователей находится в первой базе данных, а таблица сообщений - во второй.Как я могу сопоставить их?

Отображение таблиц моих пользователей и сообщений:

<hibernate-mapping>
    <class name="com.example.hibernate.User" table="users" lazy="false">
    <id name="xId" type="int" column="xid" >
            <generator class="increment"/>   
    </id>

    <set name="messages" inverse="true" table="messages">
        <key>
            <column name="xsin_id" not-null="true" />
        </key>
        <one-to-many class="com.example.hibernate.Message" />
     </set>     
</class>
</hibernate-mapping>


<hibernate-mapping>
  <class name="com.example.hibernate.Message" table="messages" lazy="false">
       <id name="id" type="int" column="xmsgbox" >
        <generator class="increment"/>     
       </id>

       <many-to-one name="user" class="com.example.hibernate.User">
               <column name="xsin_id" not-null="true" />
           </many-to-one>
   </class>
</hibernate-mapping>

У меня также есть 2 * .cfg.xml файла, в которые сопоставляются эти классы.

Мой фрагмент кода теста:

Session session = HibernateUtilUser.getSession();

String SQL_QUERY ="from User user";
Query query = session.createQuery(SQL_QUERY);
User user = null;
for(Iterator it=query.iterate();it.hasNext();){
    user=(User)it.next();               
    break;
}
Set<Message> messages = user.getMessages();
assertNotNull(messages);

Я получаю сообщение об ошибке: Ассоциация ссылается на не отображенный класс: com.example.hibernate.Message

PS мой класс HibernateUtilUser:

public class HibernateUtilUser {

    private static SessionFactory sf;
    private static Session session;

    private HibernateUtil() {}

    public static SessionFactory getSessionFactory() {      
        if (sf == null) {
            sf = new Configuration().configure("hibernateuser.cfg.xml").buildSessionFactory();
        }       
        return sf;      
    }

    public static Session getSession() {
        if (session == null || session.isOpen() == false) {
            session = getSessionFactory().openSession(); 
        }       
        return session;
    }

    public Session openSession() {
        return sf.openSession();
    }

    public static void close(){
    if (sf != null)
        sf.close();
        sf = null;
    }
}

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

Попробуйте указать имя БД в таблице proeprty, например, table = "[ваше другое имя БД] .. messages"

<set name="messages" inverse="true" table="AnotherDB..messages"> 
        <key> 
            <column name="xsin_id" not-null="true" /> 
        </key> 
        <one-to-many class="com.example.hibernate.Message" /> 
     </set>  
0 голосов
/ 16 ноября 2010

Это решение кажется работающим текст ссылки

You need to use one SessionFactory only. Then, in the mapping files for your classes, use the schema or catalog attributes. For example:

Code:
<class name="Test1" table="Test1" catalog="...">

<class name="Test2" table="Test2" catalog="...">


This of course assumes that the databases lives in the same MySQL server.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...