ORM поддержка неизменных классов

Какой ORM поддерживает модель предметной области неизменных типов?

Я хотел бы записать классы как следующее (или эквивалентный Scala):

class A {
  private final C c; //not mutable

  A(B b) {
     //init c
  }

  A doSomething(B b) {
     // build a new A
  }
}

ORM имеет к инициализированному объект с конструктором. Таким образом, возможно проверить инварианты в конструктора. Доступ конструктора по умолчанию и поля/метода set для инициализирования не достаточен и усложняет реализацию класса.

Работа с наборами должна поддерживаться. Если набор изменяется, он должен создать копию с пользовательской перспективы. (Рендеринг старого набора указывает устаревший. Но пользовательский код может все еще продолжить работать (или по крайней мере читать), это.) Во многом как работа персистентных структур данных.

Некоторые слова о мотивации. Предположим, что у Вас есть модель объекта области стиля FP. Теперь Вы хотите сохранить это к базе данных. Кто Вы делаете это? Вы хотите сделать столько, сколько Вы можете в чистом функциональном стиле, пока злой эффект сторон не входит. Если Ваша модель объекта области не неизменна, Вы не можете, например, совместно использовать объекты между потоками. Необходимо скопировать, кэшировать или использовать блокировки. Таким образом, если Ваш ORM не поддерживает неизменные типы Ваш constrainted в Вашем выборе решения.

28
задан Thomas Jung 24 April 2010 в 07:05
поделиться

4 ответа

AFAIK, нет ORM для .NET, поддерживающих эту функцию именно так, как вы хотите. Но вы можете взглянуть на BLTookit и LINQ to SQL - оба обеспечивают семантику обновления путем сравнения и всегда возвращают новые объекты при материализации. Это почти то, что вам нужно, но насчет коллекций я не уверен.

Кстати, зачем вам эта функция? Я знаю о чистых функциональных языках и преимуществах чисто имитируемых объектов (например, полная безопасность потоков). Но в случае с ORM все, что вы делаете с такими объектами, в конечном итоге все равно преобразуется в последовательность команд SQL. Так что я признаю, что польза от использования таких объектов здесь невелика.

0
ответ дан 28 November 2019 в 03:55
поделиться

Hibernate имеет аннотацию @Immutable .

И вот руководство .

4
ответ дан 28 November 2019 в 03:55
поделиться

MyBatis, хотя и не настоящий ORM, может это сделать. Но я не пробовал.

http://mybatis.org/java.html

3
ответ дан 28 November 2019 в 03:55
поделиться

Вы можете сделать это с Ebean и OpenJPA (и я думаю, что вы можете сделать это с Hibernate, но не уверен). ORM (Ebean/OpenJPA) создаст конструктор по умолчанию (если у боба нет конструктора) и фактически установит значения "конечных" полей. Это звучит немного странно, но конечные поля не всегда являются строго конечными.

0
ответ дан 28 November 2019 в 03:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: