不同模式中表之间的关系映射
目前应用程序正在处理数据库中的多个模式,所以我们有一个存储主表的公共模式,而我们存储客户特定数据的其他模式。
所以,具体的情况就像
(以下表格为例子目的)
对于主表AnimalType
这是在居住common
模式,而Animal
表,该表可在所有客户端的模式,如schema1
, schema2
... schemaN
。
我们使用默认使用Hibernate
Grails
,关系就像
class AnimalType {
String type
static mapping = {
datasources(['index'])
}
}
class Animal {
String name
AniamlType animalType
}
所以,当我启动应用程序时,它会显示下面的异常:
原因:org.springframework.beans.factory.BeanCreationException:创建名为'sessionFactory'的bean时出错:init方法的调用失败; 嵌套异常是org.hibernate.MappingException:来自表动物的关联指的是未映射的类:org.sample.AnimalType
我从中理解的是, Animal
正试图在它自己的模式中引用AnimalType
,但AnimalType
在那里并不存在。
所以,基本上我想将Animal
映射到指向common
模式的AnimalType
。
类似下面的Grails中的语法
class Animal {
String name
@(POINTING TO COMMON SCHEMA)
AnimalType animalType
}
在你的mapping
添加如下内容:
table name: "animal_type", schema: "common"
从当前文档
修订答案
Hibernate是数据库顶层的抽象层。 根据你的@(POINTING TO COMMON SCHEMA)
表示法,你可能来自Java背景。 使用下面的基本方法,我们的组连接到数十个模式和多个数据库。 连接到各种模式时,利用Grails域类来使用约定而不是配置。 查看关于将表映射到域类的Grails文档。 让我试着通过描述示例数据库模式和域类映射来进行解释。
希望您通过应用程序用户访问数据库。 我们称之为ANIMAL_APP。 ANIMAL_APP可以访问下列表格:
其中每个都可以有自己的域类。 他们也可以拥有自己的控制器,可以在其中建立个性化的逻辑.BEE飞行和TIGERS不是可以在单独的控制器动作中考虑的。
AnimalType DOMAIN CLASS
class AnimalType{
//AnimalType properties
static mapping = {
table 'ANIMAL_TYPE', schema: 'ANIMAL_APP'
id column: 'id'
}
}
TIGER DOMAIN CLASS //可以是任何动物
class Tiger{
Sting name
String value
static belongsTo = [animalType:AnimalType]
static mapping = {
table 'TIGER', schema: 'ANIMAL_APP'
//Be aware that you could map to a different schema as follows
//table TIGER, schema: 'TIGER_SCHEMA'
id column: 'id'
}
}
一旦这些类相互关联,就可以在数据库中管理应该管理的表访问。 为架构ANIMAL_APP可用于TIGER,SNAKE和BEE的表创建同义词。 为每个表格授予对ANIMAL_APP的正确权限。
在Config.groovy
和DataSource.groovy
配置数据源
Config.groovy
为每个环境配置JNDI数据源。 请记住,您正在使用ANIMAL_APP映射到数据库。
grails.naming.entries = [
"jdbc/devanimalapp": [
type: "javax.sql.DataSource", //required
auth: "Container", // optional
description: "Data source for Production", //optional
driverClassName: "oracle.jdbc.OracleDriver",
url: "[replace with your databaseDriver]@[jndi location]",
username: "ANIMAL_APP",
password: "secret",
],
"jdbc/prodanimalapp": [
type: "javax.sql.DataSource", //required
auth: "Container", // optional
description: "Data source for Production", //optional
driverClassName: "oracle.jdbc.OracleDriver",
url: "[replace with your databaseDriver]@[jndi location]",
username: "ANIMAL_APP",
password: "secret",
]
]
DataSource.groovy
然后配置如下。 请记住,这是一个指南,文档可以在Grails知识库中找到。
environments {
development {
dataSource {
dbCreate = "validate" // one of 'create', 'create-drop', 'update', 'validate', ''
dialect = "[insert your database dialect]"
jndiName = "java:comp/env/jdbc/devredapp"
}
}
production {
dataSource {
dbCreate = "validate" // one of 'create', 'create-drop', 'update', 'validate', ''
dialect = "[insert your database dialect]"
jndiName = "java:comp/env/jdbc/prodanimalapp"
}
}
}
以这种方式映射您的域类将允许您利用配置的Grails约定,并且只需通过ANIMAL_APP模式访问必要的表就可以保证安全。 在ANIMAL_APP模式中控制权限和同义词将允许您连接到不同的模式甚至远程数据库。
下面的原始答案是透明度
我不确定我是否正确地理解了这个问题,但如果您试图让动物类继承(请参阅Grails GORM Inheritence)AnimalType类,则必须声明Hibernate的关系。
class AnimalType{
//some properties
static hasMany = [animals:Animal, ...]
}
class Animal{
String name
String value
static belongsTo = [animalType:AnimalType]
}
要么
class Animal extends AnimalType{
String animalName
}
如果我严重误解了你的问题,请让我知道,我会再试一次。
链接地址: http://www.djcxy.com/p/26119.html上一篇: Relational Mapping between tables in different schema
下一篇: How do I "undo" a