Hibernate MappingException:未知实体:com.xxxxxx.service.model。$ Proxy $ _ $$ _ WeldClientProxy

时间:2017-10-18 09:22:46

标签: hibernate jpa cdi mappingexception

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

  

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

这是如何引起的?如何解决?

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

1 个答案:

答案 0 :(得分:3)

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

@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);
}