问题标签 [apache-cayenne]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Apache Cayenne 多对多关系
我是 Apache Cayenne 的新手。
我只有一个实体,称为产品。这个实体与自身是多对多的关系,即一个产品可以包含产品,也可以被其他产品包含。
我无法用 Cayenne 建模这种关系。我要做的是: 1) 我创建一个名为 Composition 的表,其中包含两个字段,即 PK 和 FK。2) 我创建了两个从 Product 到 Composition 的 toMany(一个从 product.id 到 Composition.contained_id,一个从 product.id 到 Composition.base_id) 这应该与 DB 一起使用 现在我只创建一个 ObjEntity:Product。但是.. 我怎样才能建立一个扁平的关系?我正在关注这个:http ://cayenne.apache.org/doc/cayennemodeler-flattened-relationships.html但可能是因为它与自身的关系我无法在“目标”组合框中选择实体..
谢谢弗朗西斯科
编辑:如果两个实体不同,也存在目标复选框问题。Cayenne Modeler v.3.0.2
java - 在 Apache Cayenne 中获取新的数据对象
我希望记录对某些表执行的每个操作。我想在列级别(不是全部,而是一些)记录,所以如果某个列的值已更改,我想记录它,例如。
用户 U 更改了产品 x 的价格
(假设价格和产品在同一张表中。)
为此,我想监控产品 x 的价格列。
我不能使用触发器来执行此操作,因为我也希望用户被记录,用户信息 atm 位于门户应用程序中(不能将其传递给触发器)。
我目前正在使用 apache cayenne,并且在更新前(在实体类中)回调时,我想将新价格(用户在门户中选择的价格)与数据库中的价格进行比较
当我尝试从数据库中获取产品时,cayenne 不会返回一个新对象,而是返回具有更改值的相同对象
我想知道是否有人知道 Cayenne 可以通过某种方式为我返回相同 pk(id) 的新对象(这就是我用来从数据库中获取新对象的方法)
或者
可以用其他方式给我建议
java - Eclipse - 导入问题
我有我正在尝试调试的项目,并且我确定它使用的是 Cayenne 3.2,我已经下载了 cayenne 3.2 源,现在如果我在选择 Import -> File System -> 后尝试将 Cayenne 源作为项目导入,然后选择根 Cayenne 目录或具有源的子目录之一,我得到“源在目标的层次结构中。” 并且 Eclipse 不允许我导入源代码。如果我不导入它,并且在引发异常时,我单击编辑源查找以附加源,我选择 cayenne 根目录或子目录之一,它不起作用。如果我选择 Jar 或 zip 文件,代码会显示 1 秒然后再次消失!
有人知道修复吗?
apache-cayenne - 使用反向工程对象时 Apache Cayenne 中的 NoSuchFieldException
从远程客户端查询选择到 apache cayenne 服务器时,我遇到以下问题。
出于测试目的,我只从一张表中生成了一个独立的类。我生成了客户端类(超类和子类)和服务器类。我启动了服务器,如 cayenne 教程中所示。日志告诉我一切都很好。现在我尝试与客户端连接,如 cayenne 教程中所示:
说到这条线:
然后我得到一个像这样的异常: java.lang.NoSuchFieldException: id at java.lang.Class.getDeclaredField(Class.java:1899) at org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy(FieldAccessor.java:156) at org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy(FieldAccessor.java:165) at org.apache.cayenne.reflect.FieldAccessor.prepareField(FieldAccessor.java:103) at org.apache.cayenne.reflect.FieldAccessor.(FieldAccessor .java:49) 在 org.apache.cayenne.reflect.PersistentDescriptorFactory.createAccessor(PersistentDescriptorFactory.java:355) 在 org.apache.cayenne.reflect.PersistentDescriptorFactory.createAttributeProperty(PersistentDescriptorFactory.java:147)
关于它的疯狂之处在于,当我清空“源”表时,一切正常,我毫无例外地得到一个空列表。
我也不清楚我可以查询我的类集中的所有 10 个对象,并且异常总是命中所选类的第一个属性。如果我研究这些课程,那么该领域就在那里。它们位于 cayenne 建模器生成的抽象类中,并且具有异常给出的确切名称。
这是客户端上的源类:
}
这是相应的服务器类:
}
我在 Jetty WebServer 上使用 Cayenne Server 和 Client 3.0RC3,如 cayenne 教程中所示。
有谁知道为什么会发生这种异常?
java - Cayenne:使用由 cayenne 生成的手动创建的类实例更新数据库
我正在尝试使用 cayenne 与 PostgreSQL 数据库进行交互。到目前为止,一切都按预期工作,但我现在遇到了一个我不太了解的问题(我是卡宴新手)。
假设我有一个包含常用字段(book_id、title、editor、price)的表“books”、一个“表”作者(author_id、author_name)和一个链接表“books_authors”(book_id、author_id)。
与添加或编辑一本书的过程相关的所有类共享一个 DataContext。
我有一个 struts2(我使用速度模板)表单,可以让您添加一本书,并使用 ajax 与多个作者关联。我对某个事件做出反应,触发一个调用 struts2 操作的 ajax 请求,该操作验证作者是否存在,然后将 Books_Authors 对象(由 cayenne 生成的类)添加到 struts2 会话(该操作实现 SessionAware)。
表格如下所示:
一旦我将表单提交给 AddOrEditBook.do,它有一个用于 book 的 setter 和 getter,struts2 就会创建 book 对象并用表单的值填充它。那很好。
这是困扰我的事情:
当我更新一本书时,我没有找到使用struts创建的对象来更新db的方法。我想要实现的是以某种方式指示 cayenne 使用 struts 创建的对象来更新数据库中的相应实体。
我在 object_id、PersistenceState 等方面搞砸了很多:
使用 cayenne 更新数据库实体时正确的策略是什么?是否只能通过制作诸如 bookFromDb.setTitle(book.getTitle()); 之类的东西来做到这一点??
谢谢!
sql-server - 如何将驱动程序添加到 CayenneModeler 识别的列表中?
我是 Apache Cayenne 的新手,我正在尝试我的第一个项目。我正在尝试使用 CayenneModeler 的Tools > Reengineer Database Schema功能对 SQL Server 数据库进行逆向工程。
我试图创建一个新的“保存的数据源”。我从其适配器列表中选择了“org.apache.cayenne.dba.sqlserver.SQLServerAdapter”,CayenneModeler 自动填写了 JDBC Driver 字段并添加了一个示例 DB URL。我修改了数据库 URL,提供了用户名/密码,单击“继续”,然后我收到以下错误:
驱动程序加载错误:com.microsoft.sqlserver.jdbc.SQLServerDriver
我认为这意味着 CayenneModeler 默认情况下确实有一个用于 sqlserver 的驱动程序(?)但我看不到将 CayenneModeler 指向任何其他驱动程序的方法......
任何 Cayenne 专家都知道我可能做错了什么吗?假设这是问题所在,有没有办法为 CayenneModeler 提供所需的驱动程序?或者如果缺少驱动程序不是问题,有谁知道是什么?
tomcat7 - Apache Cayenne ROP 服务器“没有与请求关联的会话。” 在 Tomcat 7 上
我开发了一个带有 java 富客户端和远程对象持久性服务器的 cayenne 项目。如果我有钱的 cient 连接到部署在本地主机上同一台机器上的 Cayenne-ROP-Server(在 Jetty 上来自 maven 目标,如在 cayenne rop 教程中解释的那样),一切都很好:
如果我将第一行中要连接的 url 更改为非本地主机(ubuntu 上的 Tomcat7),那么一切正常,直到第 4 行:
然后我收到错误“没有与请求关联的会话”
这是客户端的完整输出:
这是 Apache Tomcat 日志的服务器端输出:
我使用 Apache Cayenne 3.0.2、Apache-Tomcat 7.0.29 和 Java 7 sdk
每个帮助都提前 THX
PS。也许本地 Jetty 服务器以另一种方式处理事情,就像远程 unix 机器上的 Tomcat 服务器一样。
编辑:在 Andrus 在下面的答案中给出提示之后,我添加了一个看起来像这样的 SessionListern:
因此,在执行此问题之上的 4 行代码状态时,此侦听器为我提供了以下输出:
在这里你可以看到有一个会话被创建并且没有会话被杀死。那么为什么我的代码行中的 ObjectContext
确实忽略了会话。在进行查询之前我是否必须明确设置它?客户端访问远程部署的 cayenne 服务器的标准初始化代码是什么。它与 cayenne rop 教程中给出的不同吗?
提前谢谢。
编辑:我升级到 cayenne 3.1B1 希望摆脱这个错误,但同样的情况:“没有会话......”尝试发送查询时。
我还在 localhost 上设置了一个 tomcat 并将其配置为与远程相同。尝试发送查询时出现相同的问题“无会话...”。
因此,localhost 上的 Jetty 是唯一一个从上面获取 4 行初始化代码并为每个后续查询保存会话的码头。所以这是我的问题。这个星球上是否有人曾尝试在 tomcat 上部署 cayenne rop 服务器并成功了?
对于每一个小提示,请提前 THX。
编辑:所以我在本地 tomcat7 上做了一点服务器端调试。
1.Client从上面执行第2行代码:
在服务器端,我的会话侦听器被触发并告诉我一个会话已创建,ID 为:B6565298F222294F601B76333DBE4911
2.Client从上面执行第3行:
在服务器端,类 org.apache.cayenne.remote.service.HttpRemoteSession 的方法被调用:
此方法的第一行创建了一个新会话。其 ID 为:ECC4A81D6240A1D04DA0A646200C4CE6。这个新会话只包含一个属性:键是“org.apache.cayenne.remote.service.HttpRemoteService.ServerSession”,值是(谁猜到了?)之前在步骤 1 中创建的会话让我感到奇怪的是,我的尽管创建了新会话,但不会触发 serveltListener。
3.Client从上面执行第4行
现在在服务器端再次调用 getServerSession() 方法。这次还创建了一个新会话(为什么?)。并且此会话不包含任何属性。所以这行“return (ServerSession) httpSession.getAttribute(SESSION_ATTRIBUTE);” 在方法 getServerSession() 内部返回 null ,这恰好触发了异常“No Session associated with request”。
那么,为什么 cayenne 服务器端会创建 e ne 会话而不使用之前创建的旧会话呢?我是否必须在查询中明确发送会话?
编辑:我在运行上面的四行代码时从 netbeans http-monitor 截屏:
java - struts2 创建会话对象,为什么以及何时?
只有当用户在我的 Web 应用程序中成功通过身份验证时,我才想创建会话。但是出于某种原因,即使我们只是访问登录页面,struts2 也会创建会话对象。
我浏览了 struts2 的一些文档,发现使用 struts.custom.i18n.resources 可能会创建会话。所以我从我的 struts.xml 文件中删除了它。但即使在我的 Web 应用程序中创建了会话。
对此的任何帮助/想法都非常感谢。
更新的问题
我的 web.xml 中有以下几行来处理 Cayenne 数据上下文。
这会导致在我的 Web 应用程序中创建会话吗?
-纳伦德拉
java - 防止 Cayenne 更新某些列值
我不想更新 cayenne 中的某些列值,但我想插入它们。插入行后,我将永远不想更新某些列值。我怎么能在卡宴中做到这一点。如果它在映射文件中是休眠的,我们可以指定一些东西
如何在 cayenne 映射文件中指定以上一项。对此的任何帮助都非常感谢。
-纳伦德拉
java - 如何仅检索表的 PK
我正在使用 MySQL DB 下的 Java Apache Cayenne。我有一个很大的表,只有一个 bigint PK 和一些字段。我只想检索 PK 值而不是映射此实体的所有对象,因为它太耗费资源了。
有没有我可以使用的片段,而不是检索所有对象的片段?