【问题标题】:Hibernate MappingException: Unknown entity: com.xxxxxx.service.model.$Proxy$_$$_WeldClientProxyHibernate MappingException:未知实体:com.xxxxxx.service.model.$Proxy$_$$_WeldClientProxy
【发布时间】:2017-10-18 09:22:46
【问题描述】:

我正在使用 Maven 多模块项目。 我将我的逻辑分为不同的层,表示层、业务逻辑层、数据层,每一层都在一个单独的模块(层)中。 当我尝试插入一个对象时,会发生此异常:

org.hibernate.MappingException:未知实体:com.xxxxx.service.model.Object$Proxy$_$$_WeldClientProxy

这是怎么引起的,我该如何解决?

我正在使用 CDI bean,应用程序基于 JSF2 和 Hibernate。

【问题讨论】:

标签: hibernate jpa cdi mappingexception


【解决方案1】:

当您有一个也被声明为 CDI 托管 bean 的 JPA 实体时会发生此问题,如下所示:

@Named // Or @XxxScoped
@Entity
public class YourEntity {}

您尝试像下面这样持久化 CDI 托管 bean 实例本身:

@Inject
private YourEntity yourCDIManagedEntity;

@PersistenceContext
private EntityManager entityManager;

public void save() {
    entityManager.persist(yourCDIManagedEntity);
}

这不是正确的方法。您不应该使您的实体成为 CDI 托管 bean。 A CDI managed bean is actually a proxy class。您可以在异常消息中清楚地看到这一点。它说它不知道实体com.xxxxx.service.model.Object$Proxy$_$$_WeldClientProxy,而不是它不知道实体com.xxxxx.service.model.Object。

@Entity // NO @Named nor @XxxScoped!
public class YourEntity {}

您应该将其准备为普通实体实例,然后您可以安全地将其作为普通实体持久化。

private YourEntity yourNormalEntity;

@PersistenceContext
private EntityManager entityManager;

@PostConstruct
public void init() {
    yourNormalEntity = new YourEntity();
}

public void save() {
    entityManager.persist(yourNormalEntity);
}

【讨论】:

  • 伟大的 BalusC 。你的解决方案正是我需要的。它现在对我有用。谢谢。
猜你喜欢
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多