【问题标题】:Persistence context Hibernate持久化上下文休眠
【发布时间】:2012-09-20 11:33:57
【问题描述】:

我想知道这种情况的正确解决方案是什么。该方法在事务中运行。我删除了此方法的第一行,我将获得传递给持久异常的分离实体。我明白这个问题。公司不在持久性环境中。 下面的代码是唯一的解决方案吗?这是更好的方法吗?

@Override
public void delete(Company company) {
    company = companyDao.get(company.getId(), CompanyLoadParameter.LOAD_LANGUAGES);
    companyDao.delete(company);
}

【问题讨论】:

  • 要理解这个问题,您希望从数据库中删除特定的公司实体,但不希望先执行 SELECT 吗?
  • 是的。是否可以在不首先从 DB.company = companyDao.get(company.getId(), CompanyLoadParameter.LOAD_LANGUAGES); 获取对象的情况下执行相同操作;

标签: hibernate jpa persistence jpa-2.0


【解决方案1】:
Session#createQuery("DELETE FROM " + Company.class.getName() +
    " WHERE " + Company.K_id "=?")
    .addParameter(0, CompanyLoadParameter.LOAD_LANGUAGES)
    .executeUpdate();

其中 Company.K_id 是主键的 Java 属性名称(作为字符串)。

public static final String K_id = "id";

我这样做是因为可以使用标准 IDE 工具重构 HQL,之后可能会继续工作。

HQL 上的 URL https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/queryhql.html

【讨论】:

  • 好的,HQL 就是答案。谢谢
【解决方案2】:

是的,这是删除单个实体的正确方法,据我所知,没有更好的方法。

如果您在使用 Eager fetch 时遇到问题,那么您应该重新考虑 JPA 实体的配置。


还有其他方法是使用 HQL DELETE 查询,但这有一个issue。删除操作不会级联到关联的集合。这既危险又丑陋。

JPA 2.1 中他们提到了批量 DELETE 查询,但他们没有提到使用 DELETE 查询删除单个实体的任何内容,我认为这一定是有原因的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多