来自多个数据库的 Hibernate 实体

2024-03-03

我们的数据模型分为两个数据库上的模式。除了一些在两者之间桥接的单键关系之外,这些模式是单独使用的。没有跨两个数据库的写入事务。

类似这个问题使用 Hibernate 连接不同数据库中的 2 个表 https://stackoverflow.com/questions/3552330,我们想要使用 Hibernate 来处理连接实体。我们无法使用数据库解决方案(DB2 上的联合视图)。

我们为 Hibernate 设置了两个独立的数据库配置(Doctor 和 Patient),这在使用 DAO 显式访问特定会话时完美运行。

我们希望使用 Hibernate 在调用时自动检索实体DoctorBO.getExam().getPatient()其中 Examination 包含一个指向另一个数据库上的 Patient 表的 id。

我尝试执行此操作的一种方法是使用自定义 UserType:

public class DistributedUserType implements UserType, ParameterizedType
{
    public static final String CLASS = "CLASS";
    public static final String SESSION = "SESSION";

    private Class<? extends DistributedEntity> returnedClass;
    private String session;

    /** {@inheritDoc} */
    @Override
    public int[] sqlTypes()
    {
        // The column will only be the id
        return new int[] { java.sql.Types.BIGINT };
    }

    /** {@inheritDoc} */
    @Override
    public Class<? extends DistributedEntity> returnedClass()
    {
        // Set by typedef parameter
        return returnedClass;
    }

    /** {@inheritDoc} */
    @Override
    public boolean equals(Object x, Object y) throws HibernateException
    {
        if (x == y)
        {
            return true;
        }

        if ((x == null) || (y == null))
        {
            return false;
        }

        Long xId = ((DistributedEntity) x).getId();
        Long yId = ((DistributedEntity) y).getId();

        if (xId.equals(yId))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    /** {@inheritDoc} */
    @Override
    public int hashCode(Object x) throws HibernateException
    {
        assert (x != null);
        return x.hashCode();
    }

    /** {@inheritDoc} */
    @Override
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException
    {
        Long id = rs.getLong(names[0]);
        return HibernateUtils.getSession(session).get(returnedClass, id);
    }

    /** {@inheritDoc} */
    @Override
    public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException
    {
        DistributedEntity de = (DistributedEntity) value;
        st.setLong(index, de.getId());
    }

    /** {@inheritDoc} */
    @Override
    public Object deepCopy(Object value) throws HibernateException
    {
        return value;
    }

    /** {@inheritDoc} */
    @Override
    public boolean isMutable()
    {
        return false;
    }

    /** {@inheritDoc} */
    @Override
    public Serializable disassemble(Object value) throws HibernateException
    {
        return (Serializable) value;
    }

    /** {@inheritDoc} */
    @Override
    public Object assemble(Serializable cached, Object owner) throws HibernateException
    {
        return cached;
    }

    /** {@inheritDoc} */
    @Override
    public Object replace(Object original, Object target, Object owner) throws HibernateException
    {
        return original;
    }

    /** {@inheritDoc} */
    @Override
    public void setParameterValues(Properties parameters)
    {
        String clazz = (String) parameters.get(CLASS);
        try
        {
            returnedClass = ReflectHelper.classForName(clazz);
        }
        catch (ClassNotFoundException e)
        {
            throw new IllegalArgumentException("Class: " + clazz + " is not a known class type.");
        }

        session = (String) parameters.get(SESSION);
    }
}

然后将使用:

@TypeDef(name = "testUserType", typeClass = DistributedUserType.class, parameters = {
                                                                                 @Parameter(name = DistributedUserType.CLASS, value = PatientBO.CLASSNAME),
                                                                                 @Parameter(name = DistributedUserType.SESSION, value = HibernateUtils.PATIENT_SESS) })

@Type(type = "testUserType")
@Column(name = "PATIENT_ID")
private PatientBO patient;

UserType 有效 - 数据已正确加载,仅将字段的 ID 保存到数据库中。我测试过非常简单的例子doctor.getExam().getPatient() and doctor.getExam().setPatient()两者似乎都工作得很好,但是我认为这是一个可怕的黑客,我没有足够的 Hibernate 知识来知道这是否可以安全使用。

有没有更好的方法来实现我们想要的?我在这里描述的方式是否足够,或者是否会在将来造成困难?


我认为这不是一个好主意。您试图让所有内容“好像”都在一个数据库中,但事实并非如此。你让“好像”有一个真实的toOne检查和患者之间的关联,尽管这不是真正的关联。

尽管您意识到这一事实,但其他或未来的开发人员不一定会意识到这一点,并且会想知道为什么不可能进行如下查询

select e from Exam e left join fetch e.patient

or

select e from Exam e where e.patient.name like 'Smith%'

简而言之,你的伪协会只履行了常规协会提供的合同的一小部分,在我看来,这会造成更多的混乱而不是安慰。

没有什么可以阻止你拥有像这样的实用方法

Patient getExamPatient(Exam e)

它做了同样的事情,但清楚地表明两个实体之间没有真正的关联。

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

来自多个数据库的 Hibernate 实体 的相关文章

  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • 无法将 INode 类型值分配给 类型变量。为什么?

    我想知道为什么以下代码无法工作 public static
  • Apache Commons VFS - 无法解析文件

    VFS 方法无法处理此 URI jboss server temp dir local outgoing配置在jboss beans xml这是决心 C Download jboss eap 5 1 1 server default tmp
  • Java - toString 到 Color

    我一整天都在努力解决这个问题 基本上我做了一个 for 循环 将条目添加到数组列表中 其中一项是 颜色 变量 我已经用过random nextInt为颜色构造函数的红色 绿色和蓝色部分创建新值 我还设置了一个toString方法 这样我就可
  • Java时间转正常格式

    我有 Java 时间1380822000000 我想转换为我可以阅读的内容 import java util Date object Ws1 val a new Date 1380822000000 toString 导致异常 warnin
  • 如何使用 Swipe 视图实现 Android TabLayout 设计支持库

    我将使用 android TabLayout 设计支持库 但我不知道如何使用滑动视图 这是我的代码 XML
  • 使用java在网页中进行字符编码

    如何使用java找出网页中的字符编码类型 打开与 URL 的连接 使用URL openConnection http download oracle com javase 6 docs api java net URL html openC
  • 使用 equals 方法比较两个对象,Java

    我有一个对象数组 我想将它们与目标对象进行比较 我想返回与目标对象完全匹配的对象的数量 这是我的计数方法 public int countMatchingGhosts Ghost target int count 0 for int i 0
  • Java给定长度的随机数

    我需要在 Java 中生成一个恰好 6 位数字的随机数 我知道我可以在随机发生器上循环 6 次 但是在标准 Java SE 中还有其他方法可以做到这一点吗 要生成 6 位数字 Use Random http download oracle
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • Javac 版本 1.7 无法为目标 1.7 构建

    我试图在 Linux Mint 系统上使用 Sun Java JDK 1 7 0 17 编译 Java 代码 但遇到了这个问题 javac version target 1 7 javac 1 7 0 17 javac invalid ta
  • 要做或不做:将图像存储在数据库中[重复]

    这个问题在这里已经有答案了 在 Web 应用程序的上下文中 我的前老板总是说在数据库中放置对图像的引用 而不是图像本身 我倾向于同意在数据库中存储 url 与图像本身是一个好主意 但在我现在工作的地方 我们在数据库中存储大量图像 我能想到的
  • 如何更改phpmyadmin MySQL的IP地址?

    我在 xampp 中更改了 apache 的 IP 地址 但无法连接到 MySQL 我认为问题是我的 apache 不在我的数据库的同一网络上 我的 apache 位于 192 168 1 10 而我的 MySQL 位于 127 0 0 1
  • 在java中创建一个XML树并将其转换为json对象

    我尝试创建也能够转换为 json 的树 但对于只有一个xpath 当我尝试实现多个 xpath 时 我无法获得所需的输出 这里我分享一下我的实现 private static Document addElemtbypath List
  • 设置 Firefox 配置文件以使用 Selenium 和 Java 自动下载文件

    我想使用 Selenium WebDriver 和 Java 验证文件下载 要下载的文件为 PDF 格式 当 WebDriver 单击 AUT 中的 下载 链接时 Firefox 将打开以下下载确认窗口 我希望 Firefox 自动下载文件
  • 乔达时间中两个日期之间的天数

    如何找到两次之间的天数差异乔达时间 http www joda org joda time DateTime http www joda org joda time apidocs org joda time DateTime html实例
  • 如何在apache POI中读取excel文件的准确单元格内容

    当我读取单元格的内容时 例如如果它是日期格式 它会转换为另一个值 例如 12 31 2099 gt 46052 和 50 00 gt 50 和 50 00 gt 0 5 但我想要的是获取每个单元格的确切字符串值 我的代码是这样的 cell
  • 检查 Java 字符串实例是否可能包含垃圾邮件数据的最简单方法

    我有一个迭代 String 实例的过程 每次迭代对 String 实例执行很少的操作 最后 String 实例被持久化 现在 我想为每次迭代添加一个检查 String 实例是否可能是垃圾邮件的检查 我只需验证 String 实例不是 成人材
  • 在 for 循环比较中使用集合大小

    Java 中 Collections 的 size 方法是否有编译器优化 考虑以下代码 for int i 0 i

随机推荐

  • 在 IntelliJ Idea 中调试时避免 Groovy/Grails 内部机制

    我正在使用 IntelliJ Idea 8 1 2 进行 Grails 开发 Groovy 的动态特性让我很难调试代码 我总是陷入 Groovy Grails 的内部 即 CachedMethod ExpandoMetaClass 等 例如
  • 不包含多个特定单词的字符串的正则表达式

    我正在尝试组合一个正则表达式来查找特定单词don t存在于字符串中 具体来说 我想知道什么时候 主干 标签 或 分支 不存在 这是针对 Subversion 预提交挂钩 基于正则表达式匹配不包含单词的字符串 https stackoverf
  • DLL 的配置文件

    我们的应用程序在运行时从应用程序的根加载我们的自定义 DLL 这些 DLL 正在实现某些接口 并通过反射执行方法 如果自定义 DLL 必须从配置文件中读取某些值 那么我们必须将这些配置设置复制到主应用程序的 app config 文件中 有
  • Scrapy Image Pipeline:如何重命名图像?

    我有一个蜘蛛可以获取数据和图像 我想用我正在获取的相应 标题 重命名图像 以下是我的代码 蜘蛛1 py from imageToFileSystemCheck items import ImagetofilesystemcheckItem
  • .cpp 文件和 .h 文件有什么区别?

    因为我已经做了 cpp文件 然后将它们传输到 h文件 我能找到的唯一区别是你不能 include cpp文件 我缺少什么区别吗 C 构建系统 编译器 不知道有什么区别 所以这都是约定之一 约定是 h文件是声明 并且 cpp文件是定义 这就是
  • 数据原子查询性能改进

    我在 Datomic 数据库中有一个与此类似的架构 tenant db id db id db part db db ident tenant guid db unique db unique identity db valueType d
  • Bootstrap 折叠力 全部展开

    我有很多不同的部分 它们有自己的折叠元素 我已经实现了 jquery 来展开和折叠它们 jQuery collapse each function index this collapse toggle HTML 片段 ul class na
  • 使用 phantomjs/casperjs 测试 DOM 元素

    我有一个基于 AJAX 的 javascript 应用程序 我想对其进行接口测试 例如 我想编写一个测试来加载我的网站 从给定的 URL 并检查是否存在一些 DOM 元素 给定的 id 和给定的类 问题是当我在浏览器中输入 URL 时 我的
  • JFreeChart 在 Y 轴上将整数值显示为浮点数

    我在用着JFreeChart创建时间序列图表 但当我将整数值作为 Y 轴传递时 它会将它们显示为浮点数 问题是什么 我正在创建这样的图表 this TodaySeriesGoldPrice new TimeSeries Price Minu
  • 无法拉取 b/c“您有未暂存的更改”,但状态显示没有更改

    我正在与一位开发人员合作 他遇到了一个我以前从未遇到过的奇怪问题 他正在开发一个存储库 需要先从其他人那里获取最新的更改 然后才能推送 他所有的改变都被承诺了 git pull Cannot pull with rebase You hav
  • 从 Fiddler 嗅探 Android 应用程序的 HTTPS 流量失败,Fiddler 中仅显示“隧道到”条目

    我正在尝试从已 root 的 Android 设备 4 4 4 捕获 HTTPS 流量 以分析应用程序的未记录协议 我已将 Fiddler 设置为代理并启用了 HTTPS 嗅探 我已在我的设备上安装了 Fiddler 生成的根证书 我已在
  • Outlook Mapi 访问共享联系人

    我想通过 Mapi 从 Outlook 导入联系人 第一步使用标准接触是没有问题的 MAPIFolder contactObjects outlookObj Session GetDefaultFolder OlDefaultFolders
  • :首次安装或使用软件包时运行代码

    我正忙着为一位对 R 知之甚少的客户编写一个包 考虑到他们的复杂数据结构 我需要在 R 中建立一个 数据库 其中包含从他们从另一家公司获得的一组电子表格中获得的大量信息 由于他们无法在计算机上安装 SQL 等 ICT 有一些电源控制问题 我
  • ffmpeg、libav 和 avconv 之间有什么区别和相似之处?

    当我跑步时ffmpeg在 Ubuntu 上 它显示 ffmpeg ffmpeg version v0 8 Copyright c 2000 2011 the Libav developers built on Feb 28 2012 13
  • 如何使 Windows 10 枢轴/选项卡标题全宽屏幕

    如何使枢轴 选项卡标题使每个单独的选项卡具有相同的宽度并拉伸枢轴标题的整个宽度而不延伸出屏幕 特别是对于移动设备 我还没有找到如何做到这一点的例子 这就是我想要实现的目标 如何使枢轴 选项卡标题使每个单独的选项卡具有相同的宽度并拉伸整个宽度
  • 用于将结构类型映射到枚举的 C++ 模板?

    我有类似的东西 struct A struct B struct C class MyEnum public enum Value a b c template
  • 如何通过环境变量设置 Java 的最小和最大堆大小?

    如何通过环境变量设置 Java 的最小和最大堆大小 我知道可以在启动java时设置堆大小 但我想通过我的服务器上的环境变量来调整它 您不能直接使用环境变量来做到这一点 您需要使用传递给 java 命令的一组 非标准 选项 运行 java X
  • 如何在没有扩展程序的情况下在 Chrome 中测量像素?

    由于工作中的安全限制 我不被允许安装 Chrome 扩展程序 Chrome 在开发者工具中内置了一个标尺 但我不知道如何像标尺允许的那样定义起点和终点 是否有无需安装 Chrome 扩展程序即可测量像素的工具或技术 您可以创建自己的标尺功能
  • 如何设置仅显示月份和年份的日期选择器的日期

    我正在尝试显示一个仅显示月份 年份菜单的日期选择器 就像这个 Q 中那样jquery 日期选择器仅显示月份年份 https stackoverflow com questions 2208480 jquery date picker to
  • 来自多个数据库的 Hibernate 实体

    我们的数据模型分为两个数据库上的模式 除了一些在两者之间桥接的单键关系之外 这些模式是单独使用的 没有跨两个数据库的写入事务 类似这个问题使用 Hibernate 连接不同数据库中的 2 个表 https stackoverflow com