如何在单个数据库中使用Hibernate处理两个不同的模式

9
我希望在数据库中使用两个不同的模式,每个模式有相同的表格集但数据不同。如何使用Hibernate并指向两个不同的模式。我是Hibernate的新手。请提供链接。
谢谢!
5个回答

11

在为您的实体定义表时,您可以使用schema元素来指定它。

@Table(name="TABLE_NAME", schema="SCHEMA_NAME")

否则,您可以使用指向各自模式的独立EntityManager,然后使用相同的实体,因为它们的结构相似。


编辑:您可以为每个模式使用单独的配置文件,然后从中构建SessionFactory,以下是一些伪代码示例。

SessionFactory sf_1 = new  Configuration().configure("schema1config.cfg.xml").buildSessionFactory();
SessionFactory sf_2 = new Configuration().configure("schema2config.cfg.xml").buildSessionFactory();

session_1 = sf_1.openSession();  //-- Similarly for other

您可以参考此链接以了解如何映射多个模式,但它不是特定于Hibernate的。


使用Hibernate,我们可以在hibernate.cfg.xml文件中配置两个模式吗?我不想使用JPA。如果配置成功,如何分别从每个模式查询数据。您能发布一个示例代码吗? - shreekanth
@shreekanth 你可以拥有多个配置文件,请参考编辑部分以获取更多详细信息。 - Nayan Wadekar
我们能否在这些表之间创建一对一的关系? - Prashanth Debbadwar
@PrashanthDebbadwar 我从未尝试过,也从未发生过。如果这些表密切相关,则它们应该存在于单个模式中。你可以自己尝试一下,不应该花费太多时间。 - Nayan Wadekar

4
在你的配置文件中:
<hibernate-configuration>
       <session-factory>
        <property name="hibernate.connection.driver_class">com.ibm.db2.jcc.DB2Driver</property>
        <property    name="hibernate.connection.url">jdbc:db2://localhost:50000/TEST</property>
        <property name="hibernate.connection.username">user</property>
        <property name="hibernate.connection.password">pwd</property>
        <property name="hibernate.dialect">org.hibernate.dialect.DB2Dialect</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">auto </property>
        <mapping class="com.test.db2procedure.User"/>
        <mapping class="com.test.db2procedure.User1"/>
      </session-factory>
     </hibernate-configuration>

在你的实体类中:
@Entity
@Table(name="SCHEMA.USER") ////Here you can specify your schema name. Here my     schema name is schema
public class User implements Serializable {

private String city;

private String firstname;
enter code here
@Id
@Column(name="ID")
private String id;

private String lastname;

public User() {
}

public String getCity() {
    return this.city;
}

public void setCity(String city) {
    this.city = city;
}
}

对于第二类,你需要执行以下操作:
@Entity
@Table(name="SCHEMA1.USER") //Here you can specify your schema name. Here my schema name is schema1
 public class User1 implements Serializable {
    private String city;

    private String firstname;

    @Id
    @Column(name="ID")
    private String id;

    private String lastname;

    public User1() {
    }

    public String getCity() {
        return this.city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

为了测试这个:

public class Test{
    public static void main(String args[]){
         SessionFactory factory ;
         Configuration cfg = new Configuration();
         cfg.configure("hibernate.cfg.xml");          
         List<User> user=new ArrayList<User>();
         factory = cfg.buildSessionFactory();
         Session session = factory.openSession();        
         String hql = "select u2.city from User u1,User1 u2 where u1.id=u2.id";
         Query query = session.createQuery(hql);

         List results = query.list();
         System.out.println("User City: "+results.get(0).toString());
    }
}

在上面的Test.class执行结果中,集成了来自schema和schema1的结果集。

我们能否在这些表之间创建一对一的关系? - Prashanth Debbadwar
@Table(name="SCHEMA1.USER") 这个对我有用,谢谢! - Carlos Chávez

2
感谢您的回复,我想补充一点发现。
情景:两个模式中有相同名称的表
  1. 在@Column注释的table属性中给出的名称应与@Table和@SecondaryTable注释中给出的名称匹配。
  2. 因此,在@Table中添加架构名称时,请确保在@Column中也添加。
@Table(name="schema1.table")
@SecondaryTables({
    @SecondaryTable(name = "schema2.table")
})

@Column( name = "col1", table = "schema2.table")

注意:您不必为主表列指定表属性。

1
从Hibernate 5开始,在创建实体类时使用目录而不是模式来定义模式。
@Table(name="TABLE_NAME", catalog="SCHEMA_NAME")

通过这个案例,您可以处理多个模式。


0
使用这个示例(在hibernate.reveng.xml中):
<hibernate-reverse-ingineering>
<schema-selection math-catalog="DataBaseName" />
<table-filter match-schema="FirstSchema" match-name="table-name1" />
<table-filter match-schema="SecondSchema" match-name="table-name2" />
</hibernate-reverse-ingineering>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接