LINUX.ORG.RU

Persistence / Data mapping


0

0

Есть ли такие фреймворки типа iBatis, но чтобы они сопоставляли не cтолько простые типы данных, но связи много-ко-многим, типа такого:

===== SQL part =====

create table Persons(id integer primary key, Name String unique not null);
create table UserAccounts(id integer primary key, Login String unique not null, Password not null) foreign key (id) references Persons(Id);
create table Tags(Id integer primary key, Content String);
create table Articles(Id integer primary key, Subject String, Body Text, Author integer) foreign key (Author) references Persons(id);
create table ArticleTags(Article_ID integer not null, Tag_ID integer not null) foreign key (Article_ID) references Articles(Id), foreign key (Tag_ID) references Tags(Id), unique (Article_ID,Tag_ID);

===== Code part =====

class Person {
Id integer;
Name String;
};

class UserAccount : Person {
Login String;
Password String;
};

class Article {
Id long;
String subject;
String text;
Person author;
Vector<Tag> tags;
}

Tag t1 = new Tag(1,«Test»);
Tag t2 = new Tag(2,«Hello Wordl»);
Person ipetrov = new UserAccount(3,«Ivan Petrov»,«loginname»,«password»);
Article a = new Article();
a.Id = 4;
a.Subject = «Test article»;
a.text = «Lorem ipsum.\nTest article.\nHello!»;
a.Author = ipetrov;
a.tags.Add(t1);
a.tags.Add(t2);

и потом вызовом Persistence.save(obj) это все автоматически распихивается в таблицы:

=== SQL operators ===

insert into Persons(ID,Name) values (3,'Ivan Petrov');
insert into Accounts(ID,Login,Password) values (3,'loginname",«password»);
insert into Tags(Id,Content) values (1,'Test');
insert into Tags(Id,Content) values (2,'Hello World')
insert into Articles(ID,Subject,Body,Author) values (4,'Subject','...',3);
insert into ArticleTags(Article_ID, Tag_Id) values (4,1);
insert into ArticleTags(Article_ID, Tag_Id) values (4,2);

и поддерживали полиморфность при чтении, то есть при восстановлении из базы:

Article a = (Article) Persistence.load(4);
System.out.println(a.Autor.getClass().FullName)

на выходе должно быть напечатано UserAccount а не Person(!), и писать всякие { foreach (Article.Tags) do { insertIntoArticleTags(Article.ID,Tags[index].Id); } } не приходилось бы ни для чтения, ни для сохранения.

★★★★★

Последнее исправление: no-dashi (всего исправлений: 1)

Это visual basic? Тогда hibernate, amazon carbonado(правда, не совсем то, но можно подпилить).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.