我有两个表,Organization 和 OrganizationReferent(其中有一列作为外键),如下所示:
通过使用 Hibernate 作为 ORM(在符合 JPA 的项目中),我获得了显示 here 的实体广告。
我应该使用基于 Java EE 6 的数据访问对象 (DAO) 来管理 CRUD 操作。
OrganizationDAO
和 OrganizationReferentDAO
都扩展了 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,*)
更改为(0,*)
)?
最佳答案
广告 1)
我认为你的做法是正确的。一件重要的事情是您如何管理交易。
一种常见的模式是让服务层类注入(inject)许多 DAO,并且此类服务类中的方法被标记为 @Transactional
,但 DAO 方法永远不会被标记为 @Transactional
。
这样的服务类对不同的对象执行复杂的操作 - 这就是它可以在不同的 DAO 上操作的原因。 您的包装类看起来像这样的服务层类。
第二件事是在这种地方不推荐使用entityManager.flush()。如果有更复杂的任务,则在每个entityManger.persist() 破坏性能后强制刷新。 您应该跳过flush()调用——flush()将在事务提交之前自动调用。
广告 2)
我建议强制创建 1 个子记录以满足 (1,*) 要求...
关于java - 通过使用 Hibernate 管理外键依赖关系来进行 CRUD 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26035813/