GORM 阻止为域创建外键约束

2023-12-04

我正在 Grails 中开发一个基于 Web 的应用程序。我遇到过一种情况,我想尝试禁止 GORM 在表中的字段上创建外键约束。

我有一个域类,它是类层次结构的一部分。域类本质上充当到目标域的链接。目标域可以是不同的类型,并且该链接域的每个子类都被设计为为每个特定类型的链接项提供链接。这些链接的项目具有某些共同的行为,即实现相同的接口,但在其他方面有所不同,因为它们存储在不同的表中。

在此链接域表中,有一列表示所链接到的项目的 ID。所有链接的项目都具有相同的基于整数的 id。问题是 GORM 尝试为同一表列创建多个外键约束,每个链接域子类都有一个外键约束,代表不同类型的链接项。我知道我可以为每次的 id 建立单独的列,其中其他 id 列将为空,但这看起来有点混乱。如果有一种方法可以告诉 GORM 我不希望它在该列上创建外键约束(因为不同的外键使用同一列),这将解决问题。

我知道问题在于引用完整性以及是否可以将链接键值放入外部表中不存在的列中,但应用程序应该防止这种情况发生。

如果失败的话,我将不得不手动加载链接的项目,而不是依赖 GORM 自动完成。


经过相对较短的谷歌搜索后,我找到了 Burt Beckwith 的博客文章:http://burtbeckwith.com/blog/?p=465这解释了 GORM 定制的基础知识。通过以下配置类,我设法阻止创建我不想创建的密钥。在 Burt 的示例中,需要一个 RootClass,但这不符合我的需要,因此省略了检查。

package com.myapp;

import com.myapp.objects.SomeClass;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsAnnotationConfiguration;
import org.hibernate.MappingException;
import org.hibernate.mapping.ForeignKey;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.RootClass;

import java.util.Collection;
import java.util.Iterator;

public class DomainConfiguration extends GrailsAnnotationConfiguration {
    private static final long serialVersionUID = 1;

    private boolean _alreadyProcessed;

    @SuppressWarnings({"unchecked", "rawtypes"})
    @Override
    protected void secondPassCompile() throws MappingException {
        super.secondPassCompile();

        if(_alreadyProcessed) {
            return;
        }

        Log log = LogFactory.getLog(DomainConfiguration.class.getName());

        for(PersistentClass pc : (Collection<PersistentClass>) classes.values()) {
            boolean preventFkCreation = false;
            String fkReferencedEntityNameToPrevent = null;

            if("com.myapp.objects.SomeClassWithUnwantedFkThatHasSomeClassAsAMember".equals(pc.getClassName())) {
                preventFkCreation = true;
                fkReferencedEntityNameToPrevent = SomeClass.class.getName();
            }

            if(preventFkCreation) {
                for(Iterator iter = pc.getTable().getForeignKeyIterator(); iter.hasNext(); ) {
                    ForeignKey fk = (ForeignKey) iter.next();

                    if(fk.getReferencedEntityName().equals(fkReferencedEntityNameToPrevent)) {
                        iter.remove();
                        log.info("Prevented creation of foreign key referencing " + fkReferencedEntityNameToPrevent + " in " + pc.getClassName() + ".");
                    }
                }
            }
        }

        _alreadyProcessed = true;
    }
}

通过将配置类放入 datasource.groovy 来将其引入 Grails:

dataSource {
    ...
    ...
    configClass = 'com.myapp.DomainConfiguration
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GORM 阻止为域创建外键约束 的相关文章

  • Grails 操作被调用两次。帮助!

    我正在编写一个 grails 应用程序并遇到一个奇怪的问题 单击页面上的提交按钮时 关联的操作会快速连续调用两次 这会导致一切都严重破坏 以前有其他人见过这个问题吗 下面是我的代码 从普惠制页面
  • 如何在 Groovy 中的 JSON Converter 方法中保留字母大小写?

    我正在尝试将 groovy 对象解析为 JSON 属性名称不遵循正确的驼峰式大小写形式 class Client String Name Date Birthdate 当我使用这个时 Client client new Client Nam
  • 在 Grails 中使用 AOP 不适用于服务

    我使用 Grails 2 2 3 并在 grails app conf spring resources groovy 中键入以下代码 beans xmlns aop http www springframework org schema
  • Grails 默认包名称

    我是 Grails 的新手 而且非常喜欢它 我想将我的课程放在像这样的包中org company project module model 重复对我来说很痛苦create domain class
  • grails 中的 log4j:如何登录文件?

    我的 grails config groovy 中有这个 log4j 配置 log4j error org codehaus groovy grails web servlet controllers org codehaus groovy
  • Grails - 如何对 addTo* 进行单元测试

    是否可以在 Grails 中对 addTo 函数进行单元测试 感谢您的帮助 文档第 9 1 节中说 http grails org doc latest guide 9 20Testing html 9 1 20Unit 20Testing
  • 在另一个插件中覆盖插件 GSP 和控制器

    我的项目中有一个相当复杂的 grails 插件依赖结构 并且在覆盖安全插件中的类时遇到问题 我的结构有点像这样 Web App Audit Plugin Spring Security Core Plugin Security Wrappe
  • Grails transactionManager 运行时出现异常

    当编译一个grails v2 3 3项目运行项目时出现以下错误Netbeans 7 4 Loading Grails 2 3 3 Configuring classpath Configuring classpath Environment
  • 每个组织的 Spring Security 用户角色

    在我的应用程序中 我有一个名为组织的顶级实体 用户和组织之间的关系是多对多的 因此 我可能会遇到以下情况 用户拥有组织的角色 ROLE ADMIN 用户拥有组织的角色 ROLE USER 我需要确保当用户 A 访问 Organization
  • 告诉 GORM 不要保留属性

    有没有办法告诉 GORM 不要保留某个属性 我计划在我的 User 类上定义一个确认密码属性 我将使用它进行验证 但不应保留 使用瞬态关键字 GORM 可以指示不保留特定属性 以下代码片段显示了瞬态属性的使用 class Book stat
  • 适合 .Net 开发人员的 Grails/Roo

    我目前正在学习 Grails 和 Roo 绝大多数培训材料都是针对新开发人员或现有 Java 开发人员 有谁知道使用 Net C ASP Net Asp Net MVC 翻译现有开发经验的任何指南 资源或技巧 你做过很多 ASP MVC 吗
  • UrlMapping 和文件扩展名

    我有以下 url 映射 name a a file controller attachment action get 我想像这样使用它
  • 我如何(或者应该?)从 Grails 中的 SiteMesh 模板 (views/layouts/main.gsp) 访问服务层?

    我需要在我正在构建的网站的页脚中创建一个顶部列表 页脚是在默认的 SiteMesh 布局模板中创建的 views layouts main gsp 为了创建顶部列表 需要访问数据库 因此我将创建顶部列表所需的所有逻辑封装在服务类中 serv
  • Grails GORM 和枚举

    我在 Grails 中使用枚举时遇到问题 我尝试在 grails 域对象中使用枚举 code package it xxx tools kanban import java util Date class Task String name
  • Spock模拟inputStream导致无限循环

    我有一个代码 gridFSFile inputStream bytes 当我尝试这样测试时 given def inputStream Mock InputStream def gridFSDBFile Mock GridFSDBFile
  • 访问 PUT 或 POST 请求的原始正文

    我正在 Grails 中实现 RESTful API 并使用自定义身份验证方案 该方案涉及对请求正文进行签名 以类似于 Amazon 的 S3 身份验证方案的方式 因此 为了验证请求 我需要访问原始 POST 或 PUT 正文内容来计算和验
  • 如何使用 JPA 和 Hibernate 修复 StaleObjectStateException

    控制器逻辑 def updateObject Object o Object get params id as Long o otherObjects clear objectDataService saveObject o id Othe
  • Grails 2.0 的性能真的那么低吗?

    我对基于 JVM 堆栈的 WEB 开发有点新手 但未来的项目将特别需要一些基于 JVM 的 WEB 引擎 所以我开始寻找一些可以快速完成事情的方法 并转向尝试 Grails 从书中看 事情看起来不错 但对很长的启动时间 grails run
  • Grails(现在)值得吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我知道这是一个复制 https stackoverflow com questions 397228 is grails worth it然而
  • 更改 Grails 的 Groovy 版本

    如何将 Grails 1 3 7 使用的 groovy 版本更改为 groovy 1 7 9 我在 Grails 1 3 7 应用程序中遇到这个问题 其中 Quartz 进程每分钟都会实例化大约 500 个新对象 如下所示 class Fo

随机推荐

  • Jaspersoft Studio 在更改报告的数据适配器时添加 uuid

    我目前正在从报表4 5 1 to 贾斯珀软件工作室 5 5 我注意到当我更改数据适配器时贾斯帕软件工作室它添加了uuid标记到报告的 XML 我与不同的数据库有不同的连接 但我讨厌必须进入 Notepad 来删除uuid 从 XML 中 当
  • 在android imageview中使用glide显示google驱动器图像

    我的驱动器网址是 https drive google com file d 0B3DFHb2 MdGYa2NMUkVtVkZ1V1k view usp sharing 我想使用 glide 在 android imageview 中显示它
  • iOS 和 Xcode:在 UITableView 中设置委托和数据源时出现不兼容类型错误

    我正在尝试以编程方式制作一个应用程序 其中包含一个 UITableView 它根据应用程序的文档目录中的文件创建项目列表 我已经能够将文件读入数组 filepathsArray 但是当我尝试使用数组填充表格时 编译崩溃并且 Xcode 抛出
  • BitmapFactory.decodeStream 无法从 ftp 解码 png 类型

    我的错误是什么 如何显示来自 FTP 的 png 我是 android 新手 尝试显示来自不同连接 源的图像 然后我已经显示了从可绘制和 HTTP 加载的图像 现在 我尝试从 FTP 显示 当我使用时 我收到消息 解码器 gt 解码返回 f
  • MySQL 理解基本连接

    我正在努力理解基本的 MySQL 连接 基本上我有 2 个表 其中一个包含客户的名字和地址 ID 另一个包含实际地址 我希望它不只是显示客户名称和地址 ID 而是显示客户名称和实际地址 我的基本选择语句是这样的 SELECT firstNa
  • 使用 Retrofit 获得通用 URL 的任何方法

    我有几个接受相同 GET 参数的 URL 主要用于分页目的 如下所示 public interface AsynchronousApi GET api users public void listUsers Query limit Inte
  • 从jquery处理android中的后退按钮

    我们用 jQuery 开发了一个与 android 集成的应用程序 只有一个 Activity 从这个活动中 我们加载一个 HTML 文件 在这个文件上我们显示和隐藏 div 内容 查看此处提供的网页并按 android 中提供的后退按钮时
  • 在 FullCalendar 中显示周数

    我正在寻找一种在议程周视图上显示周数的方法 我试过了这个方法但没有结果 实际上 我需要像这样将数字放在日历标题中 titleFormat month Calendar br MMMM yyyy week Calendar br Week W
  • log_softmax() 如何实现以更快的速度和数值稳定性计算其值(和梯度)?

    MXNet 和 PyTorch 都提供了计算 log 的特殊实现 softmax 速度更快 数值更稳定 但是 我在这两个包中都找不到该函数 log softmax 的实际 Python 实现 谁能解释一下这是如何实现的 或者更好的是 给我指
  • 快速行插入 UITableView 会导致 NSInternalInconsistencyException

    我有一个 UITableView 有时会快速插入新行 新行的插入由通知观察者处理 该通知观察者监听每当基础数据发生更改时触发的更新通知 我在所有数据模型更改和实际通知发布本身周围使用 synchronized 块 希望每个增量数据更改 和行
  • 遍历已填充的行

    因此 我尝试使用 VBA 迭代 Excel 电子表格中的工作表 我想遍历每一行 然后遍历每一列 尽管进行了谷歌搜索 但我实际上无法找到一种直观的方法来做到这一点 我假设必须填充一行的第一个单元格 如果没有 那么那一定是结束 我可以强制执行这
  • 为什么我们必须在 C# 中同时定义 == 和 !=?

    C 编译器要求每当自定义类型定义运算符时 它还必须定义 see here Why 我很好奇为什么设计者认为有必要 以及为什么编译器不能在只有另一个运算符存在时默认为其中一个运算符提供合理的实现 例如 Lua 允许您仅定义相等运算符 而您可以
  • Javascript 正则表达式和边界

    一位同事问我一个正则表达式问题 我似乎无法找到并回答他 我们使用边界在文本编辑器中突出显示特定长度的文本 但这里有一些示例代码显示了该问题 问题是 第一个文字 str replace 有效
  • 如何在反应中显示表格中的对象数组

    最近在学习react 我将状态设置为对象数组 我想在页面上的表格中显示该数组 每个对象在一行上 我一直在研究地图 但是我在理解它时遇到了一些困难 我能够在代码中的不同位置很好地使用映射来映射array 但我在通过映射时遇到问题对象数组 此代
  • 如何使用 Google Visualization Query 搜索电子表格

    我有这个简单的网页它使用 google visualization Query 从中提取三个特定单元格的值电子表格 然后根据三个相应输入字段的唯一 id 属性设置其值 google load visualization 1 packages
  • 从子路由渲染的 Jade 模板链接到静态文件

    我在使用 Node js Express Jade 时遇到了一个非常基本的问题 该问题非常难以描述 在我的 node js 应用程序中 我使用 Express 框架来路由 HTTP 请求 我还使用 Jade 模板作为视图 它们本身链接到我通
  • 如何从数据库表中为用户添加地理位置标记?

    我想对每个用户进行地理定位 我在用户表中添加两个字段纬度和经度 这是我的地图页面map html
  • 使用索引向量重新排序向量[重复]

    这个问题在这里已经有答案了 我想对向量中的项目重新排序 使用另一个向量来指定顺序 char A a b c size t ORDER 1 0 2 vector
  • 从 android 活动返回值到片段

    我有片段 F 它调用活动 A 在活动 A 中按下按钮 B 时 活动必须将选定的数组列表值返回到片段 F 并完成活动 A 这可能吗 我从 Activity 知道您可以发送意图如下的数据 Bundle bundle new Bundle bun
  • GORM 阻止为域创建外键约束

    我正在 Grails 中开发一个基于 Web 的应用程序 我遇到过一种情况 我想尝试禁止 GORM 在表中的字段上创建外键约束 我有一个域类 它是类层次结构的一部分 域类本质上充当到目标域的链接 目标域可以是不同的类型 并且该链接域的每个子