Прежде всего, нередко делать что-то вроде этого:
DocumentService {
public Document addDocument(int customerId) {
Customer customer = session.getById(Customer.class, customerId);
Document document = new Document();
customer.getDocuments().add(document);
session.update(customer);
return document;
}
}
Таким образом, в конечном итоге, чтение клиента перед добавлением документа может выглядеть как штраф за бездействие, но это путь, если выне хочу передавать полный объект Customer.
Обычно я использую что-то вроде объекта CustomerInfo, который просто хранит некоторую связанную информацию, такую как идентификатор, имя, может быть адрес и т. д. Обычно все, что часто не меняется, не критично, если пользователь видит устаревшие данные.(если это критично, часто используют событие / сообщения уведомления для обновления связанных информационных объектов).
Теперь вы можете передавать эти CustomerInfo многим распространенным методам обслуживания.Если объект Customer загружается из базы данных, я обычно обновляю объект информации о клиенте, чтобы поддерживать его как можно лучше.
Здесь есть только одно правило.Так как информация о клиенте может содержать устаревшие данные (какой-то другой пользователь изменил ее, вам нужно проверить достоверность. Вы можете ввести @Version к ней или сравнить соответствующие свойства, если они уже изменились. (Вы используете оптимистическое ведение журнала, так называемоепользовательская транзакция и две или более короткие транзакции базы данных).
Таким образом, в конце использования reattach нет ничего плохого.
Если у вас есть локальная встроенная база данных, и приложение, использующее hibernate, является единственным пользователем (однопользовательская настройка), вы можете рассмотреть возможность использования подхода единого сеанса, когда вы синхронизируете или объединяете каждый доступ к сеансу, чтобы избежать одновременных транзакций / доступа к базе данных.
Таким образом вы гарантируете, что существует только одинОбъект, представляющий каждый «объект / строку базы данных». Это позволяет легко предположить, что каждый объект и каждая информация синхронизируются с базой данных. Только в случае, если сеанс потерян, вы должны восстановить его, заново подключив все объекты, которые ваше приложение использует дляновый сеанс, чтобы избежать ситуации, когда два объекта сущности представляют одну и ту же строку базы данных, что недопустимо в hibernate.
Сводка
- Использование присоединения не является неправильным,
- Передача экземпляров сущностей в вашем приложении не является неправильной.
- Помните: Hibernate обычно выдает выбор для обновления объекта и проверки того, что он представляет текущее состояние БД, которое видит текущий сеанс / транзакция (используйте @Version для снижения стоимости).
- Вы можете использовать объекты CustomerInfo / DocumentInfo, чтобы избежать передачи экземпляров сущностей, чтобы уменьшить объем памяти и избежать перезагрузки.
- Если производительность является проблемой, вы можете использовать идентификатор непосредственно для создания документа и послекоторые создают DocumentInfo, используя идентификатор, который вы получили из оператора вставки (SQL).Таким образом, вам не нужно перезагружать пользователя или создавать объект документа.Это только для того, чтобы уменьшить объем памяти и повысить производительность, но швы не должны вас беспокоить.
Мой совет, придерживайтесь повторного подключения, если у вас нет проблем с потреблением памяти.