【问题标题】:CRUD operations by managing foreign key dependencies with Hibernate通过使用 Hibernate 管理外键依赖项来进行 CRUD 操作
【发布时间】:2014-09-25 10:04:12
【问题描述】:

我有两个表,OrganizationOrganizationReferent(其中有一列作为外键)如下:

通过将 Hibernate 用作 ORM(在符合 JPA 的项目中),我获得了广告显示的实体 @987654321 @
我应该使用基于 Java EE 6Data Access Objects (DAOs) 来管理 CRUD 操作。

OrganizationDAOOrganizationReferentDAO 都扩展了 GenericDAO 实现,该实现提供如下 create 方法:

@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,*))?

【问题讨论】:

    标签: java hibernate jakarta-ee jpa


    【解决方案1】:

    广告 1)

    在我看来,您的方法是正确的。一件重要的事情是您如何管理您的交易。 一种常见的模式是让服务层类注入了许多 DAO,并且此类服务类中的方法被标记为 @Transactional,但 DAO 方法从未被标记为 @Transactional

    这样的服务类对不同的对象执行复杂的操作——这就是为什么它可以对不同的 DAO 进行操作。 您的 Wrapper 类看起来像这样的服务层类。

    第二件事是在这种地方不推荐使用 entityManager.flush()。如果有更复杂的任务,则在每个 entityManger.persist() 中断性能后强制刷新。 您应该跳过您的 flush() 调用 - flush() 将在就在事务提交之前自动调用。

    广告 2)

    我建议强制创建 1 个子记录以满足 (1,*) 要求...

    【讨论】:

    • 感谢您的回答。您还可以建议我如何强制创建吗?
    • 我想在您的模型级别上强制执行此操作。我的意思是 Organization 对象具有带有 OrganizationReferent 对象的公共构造函数。只要我们使用hibernate,无参数构造函数就可以是私有的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多