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

标签 java hibernate jakarta-ee jpa

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

DB schema

通过使用 Hibernate 作为 ORM(在符合 JPA 的项目中),我获得了显示 here 的实体广告
我应该使用基于 Java EE 6数据访问对象 (DAO) 来管理 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,*))?

最佳答案

广告 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/

相关文章:

java - Java 中的双缓冲

java - 找不到部署 "war"的子部署 "ear"中命名的持久性单元

java - Hibernate如何删除连接表中具有空列的行

maven - 构建/部署 EJB .jar 及其依赖项

java - 无法从 LSA 缓存获取 TGT 票证

java - 为什么我得到的 char 数组为 "illegal start of expression",该方法为 "class, interface, or enum expected"?

java - Apache Tomcat 405 错误

java - Hibernate - 获取数据库中的所有表名

java - 如何在 Windows Vista 命令提示符中检查端口 8080?

spring - 在多调度程序应用程序中,每个调度程序 servlet 如何知道要检查哪些 Controller ?