8

我想在数据库中使用两个不同的模式,每个模式都有相同的表集,但数据不同。如何使用休眠并指向两个不同的模式。我是休眠的新手。请提供链接。

提前致谢

4

5 回答 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

您可以参考此链接以获取更多详细信息以映射多个模式,但它不是特定于休眠的。

于 2013-01-03T06:16:46.437 回答
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 的结果集

于 2016-02-17T10:23:46.650 回答
2

感谢您的所有回复,我想在调查结果中再补充一点

场景:两个模式中具有相同名称的表

  1. 我们在@Column 注释的属性中给出的名称应该与我们在@Table 和@SecondaryTable 注释中给出的名称相匹配。
  2. 因此,当我们在 @Table 中添加模式名称时,请确保我们在 @Column 中进行

@Table(name="schema1.table")
@SecondaryTables({
    @SecondaryTable(name = "schema2.table")
})

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

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

于 2020-02-06T22:11:31.147 回答
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>
于 2014-09-26T20:54:07.250 回答
0

从 Hibernate 5 开始,在创建实体类时使用目录而不是模式来定义模式。

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

通过这种情况,您可以处理多个模式。

于 2020-08-24T13:18:06.873 回答