修改后的答案
Hibernate 是数据库之上的一个抽象层。根据您的 @(POINTING TO COMMON SCHEMA) 表示法,您可能来自 Java 背景。使用我们小组下面的基本方法连接到数十个模式和多个数据库。在连接到各种模式时,利用 Grails 域类使用约定优于配置。请参阅mapping tables to domain classes 上的 Grails 文档。让我通过描述示例数据库模式和域类映射来尝试和解释。
希望您通过应用程序用户访问数据库。我们称它为 ANIMAL_APP。 ANIMAL_APP 可以访问以下表格:
- ANIMAL_TYPE(公共表,所有动物都可以访问)
- TIGER(仅限老虎使用)
- SNAKE(仅适用于蛇)
- BEE(仅限蜜蜂使用)
每个都可以有自己的域类。他们还将拥有自己的控制器,其中可以内置个性化逻辑。蜜蜂会飞,而老虎不会,这可以在单独的控制器动作中进行说明。
AnimalType 域类
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 knowledge base 中找到。
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 架构中的权限和同义词将允许您连接到不同的架构甚至远程数据库。
下面是透明度的原始答案
我不确定我是否正确理解了这个问题,但如果您试图让 Animal 类继承(参见 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
}
如果我严重误解了您的问题,请告诉我,我会再试一次。