CRUD-операции путем управления зависимостями внешних ключей с помощью Hibernate

1

У меня две таблицы: Organization и OrganizationReferent (которая имеет столбец как внешний ключ) следующим образом:

Изображение 174551

Используя 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. Правильно ли этот подход или я должен использовать что-то другое?

  2. Для данных мощностей следует форсировать создание или редактировать схему (например, меняя с (1,*) на (0,*))?

Теги:
hibernate
jpa
java-ee

1 ответ

1
Лучший ответ

объявление 1)

На мой взгляд, ваш подход прав. Важно то, как вы управляете своими транзакциями. Один из распространенных шаблонов состоит в том, чтобы классы класса обслуживания, которые ввели много DAO и методов в такой класс обслуживания, отмечены как @Transactional но методы DAO никогда не отмечены @Transactional.

Такой класс обслуживания выполняет сложные операции на разных объектах - поэтому он может работать на разных DAO. Класс Wrapper выглядит как класс класса обслуживания.

Во-вторых, использование entityManager.flush() не рекомендуется в таком месте. Принудительный флеш после каждого entityManager.persist() break performace, если есть более сложные задачи. Вы должны пропустить ваш вызов flush() - flush() будет автоматически вызван непосредственно перед транзакцией.

объявление 2)

Я предлагаю принудительно создать 1 дочернюю запись для соответствия (1, *) требованиям...

  • 0
    Спасибо за ответ. Не могли бы вы также предложить мне, как заставить создать?
  • 0
    Я думаю об этом на уровне вашей модели. Я имею в виду, что у объекта Organization есть открытый конструктор с объектом OrganizationReferent. Конструктор без аргументов может быть закрытым, если мы используем hibernate.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню