通过使用Hibernate管理外键依赖关系来进行CRUD操作

时间:2014-09-25 10:04:13

标签: java hibernate java-ee jpa

我有两个表,组织 OrganizationReferent (其列为外键),如下所示:

DB schema

Hibernate 用作 ORM (在 JPA - 兼容项目中),我已获得实体广告 here 即可。
我应该使用基于 Java EE 6 数据访问对象 DAO )来管理CRUD操作。

OrganizationDAOOrganizationReferentDAO扩展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,*))?

1 个答案:

答案 0 :(得分:1)

ad 1)

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

此类服务类对不同的对象执行复杂的操作 - 这就是它可以在不同的DAO上运行的原因。 您的Wrapper类看起来像这样的服务层类。

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

ad 2)

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