Используйте два файла hibernate.cfg.xml в приложении

1

как указать две конфигурации спящего режима для одного приложения, я создал два файла спящего режима и упомянул их в SessionFactory.util

Файл hibernateMaster.cfg.xml работает нормально. Но когда вы закрываете мастер-сервер базы данных и пытаетесь использовать приложение с hibernateMaster.cfg.xml и извлекаете данные, он дает мне "null"

но если я перезапущу приложение, он отлично работает с файлом hibernateMaster.cfg.xml

вот мои файлы спящего режима

hibernateMaster.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>

        <!-- Database Connection Settings -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://192.168.232.143:3306/cps</property>
        <property name="hibernate.connection.username">gaiz</property>
        <property name="hibernate.connection.password">mysql</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.current_session_context_class">thread</property>


        <mapping resource="lib/driver/mappings/Patient.hbm.xml"/>
        <mapping resource="lib/driver/mappings/Allergy.hbm.xml"/>
        <mapping resource="lib/driver/mappings/Hospital.hbm.xml"/>
        <mapping resource="lib/driver/mappings/StatStaff.hbm.xml"/>
        <mapping resource="lib/driver/mappings/StatWard.hbm.xml"/>
        <mapping resource="lib/driver/mappings/User.hbm.xml"/>
        <mapping resource="lib/driver/mappings/UserRole.hbm.xml"/>
        <mapping resource="lib/driver/mappings/UserLog.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

hibernateSlave.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>

        <!-- Database Connection Settings -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://192.168.232.144:3306/cps</property>
        <property name="hibernate.connection.username">gaiz2</property>
        <property name="hibernate.connection.password">mysql</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.current_session_context_class">thread</property>


        <mapping resource="lib/driver/mappings/Patient.hbm.xml"/>
        <mapping resource="lib/driver/mappings/Allergy.hbm.xml"/>
        <mapping resource="lib/driver/mappings/Hospital.hbm.xml"/>
        <mapping resource="lib/driver/mappings/StatStaff.hbm.xml"/>
        <mapping resource="lib/driver/mappings/StatWard.hbm.xml"/>
        <mapping resource="lib/driver/mappings/User.hbm.xml"/>
        <mapping resource="lib/driver/mappings/UserRole.hbm.xml"/>
        <mapping resource="lib/driver/mappings/UserLog.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

SessionFactoryUtil.java

package lib;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import core.resources.statisticalResource;

public class SessionFactoryUtil {
    //This class creates a session factory object by looking at the hibernate configuration (hibernate.cfg.xml)

    private static SessionFactory sesFactory;
    private static ServiceRegistry sesRegistry;
    static Configuration cfg;
    static{
        try{
             cfg= new Configuration().configure("lib/hibernateMaster.cfg.xml");
            sesRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
            sesFactory=cfg.buildSessionFactory(sesRegistry);
            try{

                Session session = SessionFactoryUtil.getSessionFactory().openSession();
                Transaction tx = session.beginTransaction();
                System.out.println("Connected to Master Database Server");
            }                   
            catch(Throwable ex){
                cfg= new Configuration().configure("lib/hibernateSlave.cfg.xml"); 
                sesRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
                sesFactory=cfg.buildSessionFactory(sesRegistry);
                System.out.println("Connected to Slave Database Server");
            }
        }
        catch(Throwable ex){
            System.out.println("Master & Slave Database Error.");
            System.err.println("Initial SessionFactory Creation Failed"+ex);
            throw new ExceptionInInitializerError(ex);
        }
    }   
    public static SessionFactory getSessionFactory() {
            return sesFactory;
    }
}

Я не знаю, сделал ли я что-то неправильно, сделал что-то не так в SessionFactoryUtil.java.

Теги:
hibernate

1 ответ

0

Ваша проблема в том, что вы инициализируете свою фабрику статическим способом.

static{
  ...
}

Этот код выполняется только один раз, когда вы запускаете свое приложение. Таким образом, когда вы закрываете свой серверный спящий режим, все еще запрашивают его.

Вы должны инициализировать обе конфигурации и использовать главный, если существует, или вторичный в другом случае. Вы можете сделать это в методе getSessionFactory(), который выполняется каждый раз, когда метод является вызовом, но не в статическом инициализаторе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню