Nous sommes en train de développer en interne un ORM SQLite pour Adobe AIR : SOFA. Nous avons décidé de le passer en open source prochainement. Il supporte le « nested fetching » , les delete et save en cascade , les formulas, les clefs composites, les relations one to one, one to many et many to many, l’héritage etc … Ce n’est pas une implémentation du pattern ActiveRecord : nous avons choisi de nous rapprocher plus d’un ORM comme hibernate qui même si il nécessite plus de configuration (bien plus) permet une plus grande souplesse dans de gros projets. Il n’y a pas de support pour les conventions pour l’instant mais pourquoi pas dans une prochaine release. Voilà un exemple de SofaQL :
Family family = sofaManager
.createQuery("load Family <=> f where f.id = :id; fetch Family.people")
.setIntegerArgument("id", 1)
.execute();
Donnera :
Handle load : load Family executing : select Family.ID as Family_0_id, Family.NAME as Family_0_name from FAMILY Family where Family.ID = 1 fetching : fetch Family.people executing : select Person.ID as Person_0_id, Person.NAME as Person_0_name, Person.ID as Person_0_id, Person.FAMILY_ID as Person_0_familyId from ( ( People Person inner join SuperPeople SuperPerson on SuperPerson.ID = Person.ID ) Person ) Person where Person.FAMILY_ID = 1
result =
(Family)#0
id = 1
name = "pezel"
people = (mx.collections::ArrayCollection)#1
filterFunction = (null)
length = 1
list = (mx.collections::ArrayList)#2
length = 1
source = (Array)#3
[0] (Person)#4
familyId = 1
id = 1
name = "arnaud"
uid = "A126F4E4-D083-68E2-0F34-723C76CA1A9C"
sort = (null)
source = (Array)#3
Ici Person est une sous class de SuperPerson. Le gros avantage comparé à un framework du type ActiveRecord c’est qu’il est possible de récupérer un objet et tous ses fils en une requête (et ceci récursivement). Dans le cas de listes cela peut s’avérer très pratique. De plus un support du batch fetching (récupération par groupe) est prévu dans la prochaine mise à jour.
Les save obéissent au même mécanisme, des cascade sont spécifiées par défaut mais peuvent être désactivées.
La dernière requête n’est pas très propre mais elle permet de supporter l’héritage à n-niveaux.
Tout ça devrait être disponible très prochainement sur google code. Stay tuned !
Articles sur le même sujet :

Commentaires