- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 MySQL 数据库构建 ADF Fusion Web 应用程序 (12c)。
为了在插入时获得自动递增的 PK 值,我使用了分配“AutoIncrementProperty”属性集(属性“AI”,值“true”)来自动递增 PK 字段的方法。所有实体都从覆盖 doDML() 的类扩展而来。一切正常,但仅供引用,这是我为此使用的代码:
protected void doDML(int i, TransactionEvent transactionEvent) {
super.doDML(i, transactionEvent);
if (i == DML_INSERT) {
populateAutoincrementAtt();
}
}
/*
* Determines if the Entity PK is marked as an autoincrement col
* and executes a MySQL function to retrieve the last insert id
*/
private void populateAutoincrementAtt() {
EntityDefImpl entdef = this.getEntityDef();
AttributeDef pk = null;
//look for primary key with Autoincrement property set
for (AttributeDef att : entdef.getAttributeDefs()) {
if (att.isPrimaryKey() && (att.getProperty("AI") != null )) {
pk = att;
break;
}
}
if (pk != null) {
try (PreparedStatement stmt =
this.getDBTransaction()
.createPreparedStatement("SELECT last_insert_id()", 1)) {
stmt.execute();
try (ResultSet rs = stmt.getResultSet()) {
if (rs.next()) {
setAttribute(pk.getName(), rs.getInt(1));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
好的,这不是问题。一切正常。
我有两个具有相应 MySQL 表的实体。我们称它们为“人”和“文件夹”。文件夹实体/表是递归的,因为它看起来像这样:
文件夹
而且,Person 实体/表看起来像这样:
人
因此,一个人有一个分配给他/她的根文件夹。 (该文件夹然后可能具有子文件夹的层次结构。)
我遇到的问题是,当我创建一个 Person 实体时,我想创建一个新的 Folder 实体,获取其 PK 值,然后将该 Integer 分配给新 Person 的 rootFolderId 属性。
应该很简单,不是吗?
在 PersonImpl 类(扩展 EntityImpl)中,我有以下方法:
private Integer createRootFolder() {
Integer newIdAssigned;
String entityName = "com.my.model.entity.Folder";
EntityDefImpl folderDef = EntityDefImpl.findDefObject(entityName);
EntityImpl newFolder = (EntityImpl) folderDef.createInstance2(getDBTransaction(), null);
newFolder.setAttribute("folderName", "ROOT");
try {
getDBTransaction().commit();
newIdAssigned = (Integer) newCollection.getAttribute("Id");
} catch (JboException ex) {
getDBTransaction().rollback();
newIdAssigned = null;
}
return newIdAssigned;
}
所以,这个方法很管用。实际上,它确实插入了一个 Folder 对象并返回其 PK 值。问题在于我何时/何地/如何调用此方法。
我可以从 PersonImpl 的 Create 方法中调用它,如下所示:
protected void create(AttributeList attributeList) {
Integer rootFolderId = null;
rootFolderId = createRootFolder();
super.create(attributeList);
this.setRootFolderId(rootFolderID);
}
但是,当然,这会在拥有的 Person 对象提交到数据库之前创建根 Folder 对象。因此,如果 Person 从未提交,我们就会无缘无故地创建一个孤立的 Folder 对象。
我试过从 PersonImpl 类中的 doDML() 调用它,如下所示:
protected void doDML(int operation, TransactionEvent e) {
Integer rootFolderId;
super.doDML(operation, e);
if (operation == DML_INSERT) {
rootFolderId = createRootFolder();
if (rootFolderId != null) {
this.setRootCollectionId(rootCollID);
getDBTransaction().commit();
}
}
}
但是……当然,当 createRootFolder() 调用 commit() 时,这会导致 doDML() 再次触发,我们遇到了一个递归问题。我玩过诸如设置标志以防止递归 doDML() 调用之类的问题,但它们都有问题。而且,我认为一定有一些我忽略的更简单的东西。
如果我能以某种方式在实体本身中以声明方式执行此操作,而无需代码,那将是理想的选择。但是,我认为编码解决方案会非常简单。我只是没有看到它。
有什么话吗?
最佳答案
好的,感谢@MihaiC,我已经解决了这个问题。
正如 MihaiC 所建议的,最好的解决方案是不使用 MySQL 的自动增量。但是,ADF 不支持 SQL92 风格的序列(出于其他原因我必须使用它)。我研究了几种模拟序列的方法,并确定了一种效果很好的混合方法。
借用这篇文章:http://www.sqlines.com/oracle-to-mysql/sequence ,我创建了一个简单的表来存储序列来模拟这种行为。
表:_sequences
我使用以下值创建了一条记录:
然后,只需查找给定命名序列的“next”值,并为下一次调用递增该值即可。为此,我基于 _sequences 表创建了一个 Sequence 实体对象。
这是我在 PersonImpl 类中使用的代码:
protected void doDML(int operation, TransactionEvent e) {
if (operation == DML_INSERT) {
// We do this only when we are ready to commit.
Integer nextSeqVal = getNextFolderSequenceNumber();
createRootFolder(nextSeqVal);
setRootFolderId(nextSeqVal);
// Need to add logic to bail out if something went wrong in the above steps.
}
// Nothing actually gets committed until we reach this line
super.doDML(operation, e);
}
private Integer getNextFolderSequenceNumber() {
SequenceImpl seq = getSequenceByName("Folder_Seq");
Integer nextVal = seq.getNext();
if (nextVal != null) {
seq.setNext(nextVal + seq.getInc());
} else {
// handle this as an error
}
return nextVal;
}
// Looks up the Sequence entity by name
private SequenceImpl getSequenceByName(String seqName) {
EntityDefImpl seqDef = SequenceImpl.getDefinitionObject();
Key seqKey = SequenceImpl.createPrimaryKey(seqName);
return (SequenceImpl) seqDef.findByPrimaryKey(getDBTransaction(), seqKey);
}
// Creates a Folder object with the passed Integer as its PK
private void createRootFolder(Integer pkID) {
String entityName = "com.my.model.entity.Folder";
EntityDefImpl folderDef = EntityDefImpl.findDefObject(entityName);
// I chose to fully-qualify EntityImpl since I have overriden oracle.jbo.server.EntityImpl
oracle.jbo.server.EntityImpl newFolder = folderDef.createInstance2(getDBTransaction(), null);
newFolder.setAttribute("FolderName", "ROOT"); // Because I want all root folders to be named "ROOT"
newFolder.setAttribute("Id", pkID);
}
因此,在 Person 主实体的 doDML() 中,我在提交到数据库之前做了四件事:
然后,如果以上所有操作都成功,则在调用 super.doDML() 时将所有内容提交到数据库。
也就是说,我相信这个逻辑是合理的。
我有点担心,在多用户环境中,两个用户可能会获得相同的 next-in-sequence 值,从而在第二个人尝试提交时导致问题。如果 ADF 允许以下事件顺序,这将是可能的:
我不知道 ADF 是否允许一个用户开始 doDML() 而另一个用户正在执行该过程。不关心此应用程序,但如果不做进一步研究,我不会相信它会用于大容量多用户应用程序。
关于mysql - Oracle ADF - 在创建父实体时创建子实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27304809/
都是整数,但一直报错 "Only assignment, call, increment, decrement, await, and new object expressions can be us
我有以下情况:一个“对话”实体/表,它有多个关联的标签。Tag 也是一个实体/表 - key/id 是 tagName(一个字符串)。 在客户端 (javascript),我在处理标签时使用字符串数组
我想通过 maven java 源代码生成器自动生成 java 源代码。我想通过查看一个大实体 xml 文件来创建实体类,该文件将包含系统中的所有实体和实体关系。据我搜索,目前maven中没有这样的插
我有一段时间有这个疑问,有人说 EJB 3.0 中没有所谓的实体 bean。有没有可能这样说,EJB 3.0 使用 JPA 来持久化数据并且没有对以前版本(EJB 2.1)中的实体 bean 进行增强
我观看了关于 Core Data 的 2016 WWDC 视频并查看了各种教程。我见过使用 Core Data Framework 创建对象以持久保存到 managedObjectContext 中的
实体(entites) 用于定义引用普通文本或特殊字符的快捷方式的变量,可在内部或外部进行声明 实体引用是对实体的引用 声明一个内部实体 语法: <!ENTITY 实体名称 "
This page建议 !ENTITY: If you want to avoid duplication, consider using XML entities (for example, [ ]
我正在努力解决这个问题:如何判断一个概念是聚合根还是只是一个实体(属于 AR 的一部分)? : 他们都有 ID 它们都是由实体或值对象组成 也许如果我需要引用其他 AR 中的实体,那么我需要将其设为
我使用 Symfony2 和 Doctrine,我有一个关于实体的问题。 出于性能方面的考虑,我想知道是否可以在不进行所有关联的情况下使用实体? 目前,我还没有找到另一种方法来创建继承带有关联的类的模
我已经尝试在 HTML 中包含以下代码,用于附加文件符号。但它显示一个空的白框。 📎 📎 📎 是否有替代的 HTML 附加文件符号实体? 如果没有,我们可以手动创建
我在 grails 中有一个域类......我如何让 gorm 在创建数据库时忽略这个实体?就别管它了。 最佳答案 如果我理解,你不想从域类创建表?如果是,请在域类中使用此代码: static map
我正在努力解决这个问题:如何判断一个概念是聚合根还是只是一个实体(属于 AR 的一部分)? : 他们都有 ID 它们都是由实体或值对象组成 也许如果我需要引用其他 AR 中的实体,那么我需要将其设为
我已经尝试在 HTML 中包含以下代码,用于附加文件符号。但它显示一个空的白框。 📎 📎 📎 是否有替代的 HTML 附加文件符号实体? 如果没有,我们可以手动创建
如何在我的实体中以 14-04-2017 格式存储日期? 但我必须从字符串中解析它。 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-
我需要从两个连接表中获取数据。数据集是什么类型?我是否需要创建一个包含这两个表中的属性的类以用于数据集类型,或者我可以使用实体模式中的类型。我如何修改我的方法才能正常工作? public static
好的,我们正在尝试建立一个中央站点来查看来自销售我们产品的多个供应商的数据。这些多个供应商使用不同的销售系统(确切地说是两个不同的系统),因此每个数据库看起来完全不同。我们与他们的数据库同步,因此数据
我是 backbone 的新手。但是当我研究模型实体时,我不明白一些事情。如果我们可以像 java 或 C# 这样的标准语言一样定义模型属性,那就太好了。有没有可能是这样的。所以我的想法是这样的: M
我想获取存储在可绘制的 xml 文件中的形状的颜色。 我来到了将 Drawable 存储在 Drawable 变量中的步骤,所以,现在我想获取形状的颜色(纯色标签)。 有什么建议吗? 最佳答案 Gra
实体是直接映射到我们的数据库(我们用于 Hibernate)的类。 在调用 DAO 之前,我们的服务类包含这些实体的业务逻辑。 我们还有命令对象,它们是与特定 View 相关的 POJO。有人告诉我实
在我的应用程序中,我需要显示不同存储过程返回的记录列表。每个存储过程返回不同类型的记录(即列数和列类型不同)。 我最初的想法是为每种类型的记录创建一个类,并创建一个函数来执行相应的存储过程并返回 Li
我是一名优秀的程序员,十分优秀!