我想在数据库中使用两个不同的模式,每个模式都有相同的表集,但数据不同。如何使用休眠并指向两个不同的模式。我是休眠的新手。请提供链接。
提前致谢
您可以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-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 的结果集
感谢您的所有回复,我想在调查结果中再补充一点
场景:两个模式中具有相同名称的表
@Table(name="schema1.table")
@SecondaryTables({
@SecondaryTable(name = "schema2.table")
})
@Column( name = "col1", table = "schema2.table")
注意:您不必为主表列指定表属性
使用此示例(在 中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>
从 Hibernate 5 开始,在创建实体类时使用目录而不是模式来定义模式。
@Table(name="TABLE_NAME", catalog="SCHEMA_NAME")
通过这种情况,您可以处理多个模式。