WebObjects/数据库开发
如果您习惯于使用 SQL 的思维方式,WO(实际上是 EOF)处理行(对象)的方式可能会让人困惑。使用 WO 处理数据库行的总体思路是
要从持久层获取对象(从数据库中检索记录,这些记录将在运行时被转换为 EnterpriseObjects),请执行以下操作
- 创建您的 EOModel 或获取适合的 EOModel
- 声明您要存储企业对象的 NSArray,这些企业对象将由表的行转换为
- 建立您的编辑上下文,“ec”(对于简单情况,只需使用 WOSession.defaultEditingContext,否则,请确保锁定/解锁)。
- 创建一个 EOQualifier(如果您想过滤来自特定表的对象)
- 创建一个 EOSortOrderings 集合(如果您希望在检索记录时预先排序)
- 创建一个 EOFetchSpecification,fs,将获取操作绑定在一起
- 执行 ec.objectsWithFetchSpecification(fs);
要获取与您已获取的任何 EnterpriseObjects 相关的任何对象(具有 EORelationship),只需像引用由另一个 POJO(Plain Old Java Object)引用的任何对象一样引用它们。该引用足以让 WO “引发错误”,从而自动为您检索引用的对象。
如果您已经完成了从数据库获取对象的足够操作,那么要更新记录,只需更新对象的相应字段(最好使用 get/set 方法)并执行
ec.saveChanges();
虽然有很多方法可以做到这一点,但最安全且可能最有效的方法是使用
EOUtilities.createAndInsertInstance(ec, "myNewEntitiesName"); ec.saveChanges();
要删除对象,首先必须显式地从 ec 中删除它,然后保存更改
ec.deleteObject(myObject); ec.saveChanges();
如果您有两个具有 EORelationship 的 EnterpriseObject 类,例如一对多关系,如下所示
A <-->> B
或
objectA className myBs ( -->>B )
objectB name myA ( -->A )
那么要创建两个这样的对象并将它们彼此关联,您需要
myA = (A)EOUtilities.createAndInsertInstance(ec, "A"); myB = (B)EOUtilities.createAndInsertInstance(ec, "B"); myA.addObjectToBothSidesOfRelationshipWithKey(b, "myBs"); // set other attributes of both myA and myB here. ec.saveChanges();
当然,您也可以使用
myB.addObjectToBothSidesOfRelationshipWithKey(a, "myA");
需要注意的是,addObjectToBothSidesOfRelationshipWithKey 方法只需要在一个对象上使用一次,就可以在两个方向上建立关系,无论关系是 toOne 还是 toMany,以及关系是双向的还是单向的。这是一个非常有用的方法。
另请参阅 removeObjectFromBothSidesOfRelationshipWithKey,它用于删除关系。
一般来说,请记住编辑上下文的目的是为您的程序提供一个运行时上下文,在这个上下文中,每个 EnterpriseObject 都是唯一的(在编辑上下文中),并且您可以在该编辑上下文中创建、添加、更新和删除对象。但是,一般来说,您在编辑上下文中所做的任何操作都不会反映在数据库中,直到您执行 ec.saveChanges()。然后,您自上次 saveChanges() 以来所做的所有更改都将提交到数据库。
当然,上述内容有一些例外情况,但这应该是您记住它的最佳方式。
当然,还有很多关于 WebObjects 的内容需要了解,但了解上述内容应该能帮助您很多,至少能为您提供在 API 参考中查找许多想法的线索。
如果您是 WO 的新手,请务必阅读EOF 诫律,以避免一些严重的问题。
如果您对任何诫律都不了解,请咨询他人。