У меня две таблицы: Organization и OrganizationReferent (которая имеет столбец как внешний ключ) следующим образом:
Используя Hibernate как ORM (в проекте JPA -compliant), я получил объявления объектов, показанные здесь.
Я должен управлять операциями CRUD с использованием Java EE 6 -based Объекты доступа к данным (объекты DAO).
И OrganizationDAO
и OrganizationReferentDAO
расширяет реализацию GenericDAO
которая предоставляет метод создания следующим образом:
@Override
public EntityClass create(EntityClass entity) throws IllegalStateException, PersistenceException, ConstraintViolationException
{
entityManager.persist(entity);
entityManager.flush();
return entity;
}
Теперь я определил класс Wrapper
с целью управления операциями CRUD, которые включают две определенные таблицы:
@Inject private OrganizationDAO organizationDAO;
@Inject private OrganizationReferentDAO organizationReferentDAO;
public final Organization createOrganization(final Organization organization) throws AlreadyExistsException, BadRequestException, DALException {
assert(organization != null);
organizationDAO.create(organization);
},
public final OrganizationReferent createOrganizationReferent(final Long organizationId, final OrganizationReferent organizationReferent) throws ConstraintViolationException, AlreadyExistsException, BadRequestException, DALException {
assert(organizationId != null);
assert(organizationReferent != null);
try {
organizationReferent.setOrganization(organizationDAO.findById(organizationId));
organizationReferentDAO.create(organizationReferent);
} catch (NotFoundException e) {
throw new ConstraintViolationException();
}
}
Правильно ли этот подход или я должен использовать что-то другое?
Для данных мощностей следует форсировать создание или редактировать схему (например, меняя с (1,*)
на (0,*)
)?
объявление 1)
На мой взгляд, ваш подход прав. Важно то, как вы управляете своими транзакциями. Один из распространенных шаблонов состоит в том, чтобы классы класса обслуживания, которые ввели много DAO и методов в такой класс обслуживания, отмечены как @Transactional
но методы DAO никогда не отмечены @Transactional
.
Такой класс обслуживания выполняет сложные операции на разных объектах - поэтому он может работать на разных DAO. Класс Wrapper выглядит как класс класса обслуживания.
Во-вторых, использование entityManager.flush() не рекомендуется в таком месте. Принудительный флеш после каждого entityManager.persist() break performace, если есть более сложные задачи. Вы должны пропустить ваш вызов flush() - flush() будет автоматически вызван непосредственно перед транзакцией.
объявление 2)
Я предлагаю принудительно создать 1 дочернюю запись для соответствия (1, *) требованиям...