3

コンテクスト

さまざまなユーザーグループで使用するために、データをいくつかの異なるスキーマに分割したいデータベース環境を作成しています。ただし、これらのデータベースの1つには共通のエンティティが含まれているため、すべての人と共有する必要があります。

データベースを想定します。

  • DB1-共通のエンティティ。
    • ホイールエンティティ
  • DB2-グループ"A";
    • 車のエンティティ
  • DB3-グループ"B";
    • オートバイエンティティ

私には3つの異なるプロジェクトがあります:

  • プロジェクト1:
    • ホイールビーン
  • プロジェクト2:
    • 車のコンストラクター
  • プロジェクト3:
    • オートバイコンストラクター

問題

プロジェクト/スキーマ(2、 "A")および(3、 "B")からホイール(プロジェクト1)にアクセスしようとしています

最初の質問:それは可能ですか?第二に:どうすればそれを行うことができますか?

hibernate.cfg.xmlプロジェクト2では、

<property name="hibernate.connection.url">jdbc:mysql://99.999.999.99:3306/DB2</property>

これは必然的にDB2へのすべての接続を制限する必要があります。または、新しい接続を追加したり、3306ポート、または少なくともDB1のすべてのデータベースを操作したりする別の方法がありますか?

プロジェクト2のproject1からのエンティティのマッピングも、次のように成功していないようです。

<mapping class="com.company.project1.Wheels"
        package="com.company.project1.Wheels" resource="com/company/project1/Wheels.hbm.xml"/>

構成

  • Eclipse Indigo
  • MySql 5.5
  • Hibernate 3.0(アノテーションではなくxmlを介したマッピング)
  • Win7

助けてくれてありがとう!

4

3 に答える 3

5

を使用@Table(catalog="")して、それらが属するデータベースを指定し、データベース間で関係を作成することもできます。

あなたの場合、カタログ属性を使用しWheelてDB1、CarDB2、およびDB3にマップします。MotorCycle

私はこのソリューションをMySQLとMSSQLで使用しており、完全に正常に機能します。これには、3つのDBすべてが同じデータベースサーバーに存在する必要があるという制約のみがあり、dbへのアクセスに使用されるユーザーは、すべてのDBに対する適切な権限を持っている必要があります。

このソリューションは、すべてのクエリでテーブルに対してスキーマ名を追加するだけです。

于 2012-12-14T13:12:53.813 に答える
1

私は自分のプロジェクトを複数の自立したプロジェクトに分割します。Wheelプロジェクトは、Wheelエンティティを処理する自給自足のプロジェクトになります。

プロジェクト1:ホイールこのプロジェクトでは、ホイール定義にアクセス/変更するためのHibernateエンティティとDAOを定義します。また、このプロジェクトでは、DB1を指す別のデータソースを構成します。エンティティクラス:

@Entity
public class Wheel {
}

DAOクラス:

@Repository
public class WheelDAO {
    @Persistence
    private EntityManager em;
}

基本的には、DAOレベルでアプリケーションを分離するという考え方です。また、サービスレベルでトランザクションを管理します。WheelDAO(DB1データソースに配線されている)とCarDAO(DB2データソースに配線されている)をイメージングし、これらをCarServiceに挿入します。

DB1             DB2          DB2
 |               |            |
WheelDAO       CarDAO       MotorcycleDAO
  \_____________/                   |
   \_____|__________________________/     
         |                        |
         |                        | 
       CarService          MotorCycleService

これらの依存関係を管理するために、IOCコンテナとしてSpringを使用することをお勧めします。Springを使わなくてもこれを達成できますが。

于 2012-12-14T11:39:08.020 に答える
1

必要なのは、必要なときに必要なdbを使用できるdb接続ファクトリだけです。

問題を解決するために適応できる以下のクラスを見てください

import java.net.URL;
import java.util.HashMap;

import javax.security.auth.login.Configuration;

public class HibernateUtil {

    private static Log log = LogFactory.getLog(HibernateUtil.class);

    private static HashMap<String, SessionFactory> sessionFactoryMap = new HashMap<String, SessionFactory>();

    public static final ThreadLocal sessionMapsThreadLocal = new ThreadLocal();

    public static Session currentSession(String key) throws HibernateException {

        HashMap<String, Session> sessionMaps = (HashMap<String, Session>) sessionMapsThreadLocal.get();

        if(sessionMaps == null) {
            sessionMaps = new HashMap();
            sessionMapsThreadLocal.set(sessionMaps);
        }

        // Open a new Session, if this Thread has none yet
        Session s = (Session) sessionMaps.get(key);
        if(s == null) {
            s = ((SessionFactory) sessionFactoryMap.get(key)).openSession();
            sessionMaps.put(key, s);
        }

        return s;
    }

    public static Session currentSession() throws HibernateException {
        return currentSession("");
    }

    public static void closeSessions() throws HibernateException {
        HashMap<String, Session> sessionMaps = (HashMap<String, Session>) sessionMapsThreadLocal.get();
        sessionMapsThreadLocal.set(null);
        if(sessionMaps != null) {
            for(Session session : sessionMaps.values()) {
                if(session.isOpen())
                    session.close();
            }
            ;
        }
    }

    public static void closeSession() {
        HashMap<String, Session> sessionMaps = (HashMap<String, Session>) sessionMapsThreadLocal.get();
        sessionMapsThreadLocal.set(null);
        if(sessionMaps != null) {
            Session session = sessionMaps.get("");
            if(session != null && session.isOpen())
                session.close();
        }
    }

    public static void buildSessionFactories(HashMap<String, String> configs) {
        try {
            // Create the SessionFactory
            for(String key : configs.keySet()) {
                URL url = HibernateUtil.class.getResource(configs.get(key));
                SessionFactory sessionFactory = new Configuration().configure(url).buildSessionFactory();
                sessionFactoryMap.put(key, sessionFactory);
            }

        } catch(Exception ex) {
            ex.printStackTrace(System.out);
            log.error("Initial SessionFactory creation failed.", ex);
            throw new ExceptionInInitializerError(ex);

        } // end of the try - catch block
    }

    public static void buildSessionFactory(String key, String path) {
        try {
            // Create the SessionFactory
            URL url = HibernateUtil.class.getResource(path);
            SessionFactory sessionFactory = new Configuration().configure(url).buildSessionFactory();
            sessionFactoryMap.put(key, sessionFactory);

        } catch(Throwable ex) {

            log.error("Initial SessionFactory creation failed.", ex);
            throw new ExceptionInInitializerError(ex);

        } // end of the try - catch block
    }

    public static void closeSession(String key) {
        HashMap<String, Session> sessionMaps = (HashMap<String, Session>) sessionMapsThreadLocal.get();
        if(sessionMaps != null) {
            Session session = sessionMaps.get(key);
            if(session != null && session.isOpen())
                session.close();
        }
    }

} // end of the class

http://www.java-forums.org/

于 2012-12-14T11:39:11.983 に答える