EclipseLink JPA“此上下文中的表无效”与@OneToMany Map

2023-11-27

我希望我只是在这里做了一些愚蠢的事情......

我正在尝试为一个设置 JPA 注释Map<String, Phone>并获取以下堆栈跟踪。

Exception [EclipseLink-6069] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.QueryException
Exception Description: The field [EMPLOYEE.PHONE_TYPE] in this expression has an invalid table in this context.
Query: ReadAllQuery(name="phones" referenceClass=Phone )
    at org.eclipse.persistence.exceptions.QueryException.invalidTableForFieldInExpression(QueryException.java:739)
    at org.eclipse.persistence.internal.expressions.FieldExpression.validateNode(FieldExpression.java:281)
    at org.eclipse.persistence.expressions.Expression.normalize(Expression.java:3259)
    at org.eclipse.persistence.internal.expressions.DataExpression.normalize(DataExpression.java:369)
    at org.eclipse.persistence.internal.expressions.FieldExpression.normalize(FieldExpression.java:208)
    at org.eclipse.persistence.internal.expressions.SQLSelectStatement.normalize(SQLSelectStatement.java:1377)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.buildNormalSelectStatement(ExpressionQueryMechanism.java:546)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareSelectAllRows(ExpressionQueryMechanism.java:1700)
    at org.eclipse.persistence.queries.ReadAllQuery.prepareSelectAllRows(ReadAllQuery.java:721)
    at org.eclipse.persistence.queries.ReadAllQuery.prepare(ReadAllQuery.java:657)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:614)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:883)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:575)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:820)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1109)
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:393)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1197)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2875)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1602)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1584)
    at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:112)
    at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:99)
    at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:88)
    at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java:161)
    at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:222)
    at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:88)
    at org.eclipse.persistence.indirection.IndirectMap.buildDelegate(IndirectMap.java:110)
    at org.eclipse.persistence.indirection.IndirectMap.getDelegate(IndirectMap.java:330)
    at org.eclipse.persistence.indirection.IndirectMap.size(IndirectMap.java:637)
    at org.eclipse.persistence.internal.queries.MapContainerPolicy.sizeFor(MapContainerPolicy.java:830)
    at org.eclipse.persistence.internal.indirection.TransparentIndirectionPolicy.instantiateObject(TransparentIndirectionPolicy.java:386)
    at org.eclipse.persistence.mappings.ForeignReferenceMapping.buildCloneFromRow(ForeignReferenceMapping.java:285)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildAttributesIntoWorkingCopyClone(ObjectBuilder.java:1594)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildWorkingCopyCloneFromRow(ObjectBuilder.java:1741)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObjectInUnitOfWork(ObjectBuilder.java:668)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:605)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:564)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:777)
    at org.eclipse.persistence.queries.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:783)
    at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:434)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1150)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:852)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1109)
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:393)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1197)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2875)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1602)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1584)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1549)
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:231)
    at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:411)
    at aaa.Test.main(Test.java:20)

创建的表如下所示:

EMP_PHONE
=================================
EMP_ID    PHONES_ID    PHONE_TYPE
------    ---------    ----------
42        1            NULL


EMPLOYEE
=================================
ID
--
42


PHONE
=================================
ID    NUM
--    --------
1     867-5309

The NULL PHONE_TYPE似乎告诉我发生了一些奇怪的事情,以及 eclipselink 正在寻找的方式EMPLOYEE.PHONE_TYPE让我觉得它正在思考这种关系PHONE->EMPLOYEE而不是相反。

JPA 实体定义如下。电话映射是单向的,电话对象应该由多个员工共享(不是我的实际类型,但这个简化的示例演示了问题)

@Entity
public class Employee {
    @Id private long id;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinTable(name="EMP_PHONE", joinColumns=@JoinColumn(name="EMP_ID"))
    @MapKeyColumn(name="PHONE_TYPE")
    private Map<String, Phone> phones = new HashMap<String, Phone>();

    public Employee() {}
    public Employee(long id) {
        this.id = id;
    }
    public long getId() {
        return id;
    }
    public Map<String, Phone> getPhones() {
        return phones;
    }
}

@Entity
public class Phone {
    @Id
    private long id;
    private String num;

    public String getNum() {
        return num;
    }
    public Phone() {}
    public Phone(String num) {
        this.num = num;
    }
    public Phone(long id, String num) {
        this.id = id;
        this.num = num;
    }
    public long getId() {
        return id;
    }
}

使用以下测试代码

EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
Employee employee = new Employee(42);
// exception will occur with or without phones added to the map
employee.getPhones().put("home", new Phone(1, "867-5309"));
em.getTransaction().begin();
em.persist(employee);
em.getTransaction().commit();

Query q = em.createQuery("select o from Employee o");
q.setHint("javax.persistence.cache.storeMode", "REFRESH");
q.getResultList();  // EXCEPTION THROWN HERE

和 persistence.xml:

<?xml version='1.0' encoding='UTF-8' ?>
<persistence xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xsi:schemaLocation='http://java.sun.com/xml/ns/persistence
           http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd'
    version='2.0' xmlns='http://java.sun.com/xml/ns/persistence'>
    <persistence-unit name='test' transaction-type='RESOURCE_LOCAL'>
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>aaa.Phone</class>
        <class>aaa.Employee</class>
        <shared-cache-mode>NONE</shared-cache-mode>
        <properties>
            <property name='javax.persistence.jdbc.user' value='uuuuuuuu' />
            <property name='javax.persistence.jdbc.password' value='pppppppp' />
            <property name='javax.persistence.jdbc.driver'
                      value='oracle.jdbc.driver.OracleDriver' />
            <property name='javax.persistence.jdbc.url' 
                      value='jdbc:oracle:thin:@localhost:1521:xe' />
            <property name='eclipselink.ddl-generation' 
                      value='drop-and-create-tables' />
            <property name='eclipselink.ddl-generation.output-mode' value='database' />
        </properties>
    </persistence-unit>
</persistence>

我在 Windows 7 上运行,使用 Oracle XE 11g 作为数据库。预先感谢您的任何见解!


这看起来像 EclipseLink 错误364922:

具有单向 OneToMany 属性和 @MapKeyColumn 注释的实体已创建正确的数据库表,映射表包含“键列”,但持久化实体仅填充 id 列而不是键列。持久化操作不会抛出异常错误,但后续查询很快就会失败,并出现以下错误: 异常描述:此表达式中的字段 [ORGANIZATION.MAILINGADDRESSES_KEY] 在此上下文中具有无效表。

无论如何,我使用 Hibernate/H2 测试了您的代码,它工作得很好。

UPDATE

我刚刚使用 EclipseLink 对此进行了测试。如果您显式设置该表MapKeyColumn,密钥已正确填充。 IE。:

@MapKeyColumn(name="PHONE_TYPE", table="EMP_PHONE")

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

EclipseLink JPA“此上下文中的表无效”与@OneToMany Map 的相关文章

  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • 在文本文件中搜索单词并返回其频率

    如何在包含单词文本的文本文件中搜索特定单词并返回其频率或出现次数 使用扫描仪 String text Question how to search for a particular word in a text file containin
  • Python模块可以访问英语词典,包括单词的定义[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 python 模块 它可以帮助我从英语词典中获取单词的定义 当然有enchant 这可以帮助我检查该单词是否存在于英语中
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 如何让spring为JdbcMetadataStore创建相应的schema?

    我想使用此处描述的 jdbc 元数据存储 https docs spring io spring integration docs 5 2 0 BUILD SNAPSHOT reference html jdbc html jdbc met
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 无法加载或查找主类,可以在命令行中使用,但不能在 IDE 中使用[重复]

    这个问题在这里已经有答案了 在将其标记为重复之前 请先听我说完 我正在尝试使用 gradle 导入一个 java 项目 功能齐全 适用于所有其他笔记本电脑 没有问题 我的项目 100 正常运行 适用于所有其他笔记本电脑 当我的笔记本电脑被重
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett

随机推荐

  • 在 iPad 上使用 Swift UI 禁用分割视图

    有没有办法在 iPad 上的导航视图中使用 SwiftUI 禁用 SplitView 通过设置NavigationViewStyle import SwiftUI struct NavView View var body some View
  • 使用标记模板文字传递更多参数

    我正在与样式组件并使用其标记模板文字语法生成组件 例如 const Button styled button background color papayawhip border radius 3px color palevioletred
  • 遍历 DOM 树

    由于大多数 全部 执行 HTML 清理的 PHP 库 例如 HTML Purifier 严重依赖于正则表达式 因此我认为尝试编写一个使用 DOMDocument 和相关类的 HTML 清理程序将是一个值得尝试的实验 虽然我还处于这个项目的早
  • 使用 GCDAsyncSocket 通过套接字进行 Telnet

    我正在尝试从目标 c 通过 telnet 连接到 Cisco C40 编解码器 在我的计算机上使用终端时 我得到 密码 然而 在进行套接字连接时 需要进行 telnet 协商 我就是这样 但由于某种原因我无法到达上面的 密码 提示 void
  • MySQL会自动优化子查询吗?

    我想运行以下查询 Main Query SELECT COUNT FROM table name WHERE device id IN SELECT DISTINCT device id FROM table name WHERE NAME
  • 覆盖默认的 Android 主题

    我已经能够覆盖任何名称前面带有 android 的主题 但 Android theme xml 还定义了似乎无法覆盖的属性 例如
  • 成员名称不能与分部类的封闭类型相同

    我定义了一个具有如下属性的分部类 public partial class Item public string this string key get if Fields null return null if Fields Contai
  • 在 sagemaker 中进行预测之前如何预处理输入数据?

    我正在使用 java Sagemaker SDK 调用 Sagemaker 端点 我发送的数据在模型可以使用它进行预测之前几乎不需要清理 我怎样才能在 Sagemaker 中做到这一点 我在 Jupyter 笔记本实例中有一个预处理功能 它
  • 相邻兄弟姐妹的边际崩溃

    我正在阅读有关保证金崩溃的文章 我发现了这一点 margin 相邻兄弟姐妹 相邻兄弟姐妹的边距折叠 除非后一个兄弟需要清除过去的浮动 我不明白最后一句话 除非后一个兄弟需要清除过去的浮动 有人可以举个例子吗 谢谢 首先 下面的示例仅适用于基
  • 输出两个单词之间的文本

    我想使用 PHP 输入某个文本 输出应该是两个单词之间的文本 澄清 Input Lorem ipsum dolor sit amet Output dolor sit str Lorem ipsum dolor sit amet word1
  • 调用仅在运行时已知的函数

    我想通过输入验证服务器来首次尝试 Rust 应用程序 该服务器可以验证 AJAX 请求中的值 这意味着我需要一种方法来使用 JSON 配置文件来根据输入值的名称以及可能在运行时在 HTTP 请求中传入的表单名称来指定使用哪些验证函数 我怎样
  • 无法在 Chrome 扩展程序中使用 jQuery 触发点击

    我试图用一行 jQuery 代码创建一个 Chrome 扩展 但它不起作用 我正在尝试触发对某个元素的点击 chrome的控制台根本没有显示任何错误 当我只将 jQuery 代码放入控制台时 它工作正常 My code 内容 js docu
  • Hibernate 5 更改为不使用仅获取第一行

    我正在使用带有 oracle 11 的 Hibernate 5 2 它不支持仅获取第一行 我需要回到旧样式的 hibernate 有没有休眠配置可以做到这一点 您可以强制 Hibernate 使用 Oracle 10g 方言 这样您将使用
  • 为什么更改总和顺序会返回不同的结果?

    为什么更改总和顺序会返回不同的结果 23 53 5 88 17 64 47 05 23 53 17 64 5 88 47 050000000000004 Both Java and JavaScript返回相同的结果 据我了解 由于浮点数以
  • eclipse中Android插件安装问题

    我正在尝试安装 ADT 插件 我转到 Help install new software in eclipse 然后选择开发工具后出现此错误 Cannot complete the install because one or more r
  • Django:通过外键字段的id进行查询的正确方法是什么?

    我有两个models class Organization models Model title models CharField max length 100 class Folder models Model organization
  • 有没有办法同时使用 GET 和 POST?

    我需要使用这两种方法一起传递一些数据 GET 和 POST 我写了这个方法 但不知道是否安全
  • firebase2.default.firestore 不是一个函数 - React Firebase

    我正在尝试使用火库在我的 Reactjs 应用程序中 当我从 firebase 配置对象调用 firestore 时 It says firebase2 default firestore 不是一个函数 这是代码 import fireba
  • 如何使匿名函数中的多个参数隐式?

    如果我们有一个接受匿名函数的方法A gt B作为参数 我们可以使A隐含在我们的调用中 def impl a Int f Int gt Int Int f a impl a implicit z gt 但是我们可以使用具有多个参数的匿名函数来
  • EclipseLink JPA“此上下文中的表无效”与@OneToMany Map

    我希望我只是在这里做了一些愚蠢的事情 我正在尝试为一个设置 JPA 注释Map