我有两个表,组织和 OrganizationReferent (其列为外键),如下所示:
将 Hibernate 用作 ORM (在 JPA - 兼容项目中),我已获得实体广告 here 即可。
我应该使用基于 Java EE 6 的数据访问对象( DAO )来管理CRUD操作。
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,*)
)?
答案 0 :(得分:1)
ad 1)
在我看来,你的方法是正确的。一个重要的事情是如何管理您的交易。
一种常见的模式是使服务层类注入了许多DAO,并且此类服务类中的方法标记为@Transactional
,但DAO方法永远不会标记为@Transactional
。
此类服务类对不同的对象执行复杂的操作 - 这就是它可以在不同的DAO上运行的原因。 您的Wrapper类看起来像这样的服务层类。
第二件事是在这样的地方使用entityManager.flush()不推荐。如果有更复杂的任务,则在每个entityManger.persist()之后强制刷新,以提高性能。 你应该跳过flush()调用 - flush <)将在事务提交之前自动调用。
ad 2)
我建议强制创建1个子记录以符合(1,*)要求......