Hibernate MappingException:未知实体:com.xxxxxx.service.model.$Proxy$_$$_WeldClientProxy
Hibernate MappingException: Unknown entity: com.xxxxxx.service.model.$Proxy$_$$_WeldClientProxy
我正在使用 Maven 多模块项目。
我将我的逻辑分为不同的层,表示层、业务逻辑层、数据层,每一层都在一个单独的模块(层)中。
当我尝试插入一个对象时,出现了这个异常:
org.hibernate.MappingException: Unknown entity: com.xxxxx.service.model.Object$Proxy$_$$_WeldClientProxy
这是怎么引起的,我该如何解决?
我正在使用 CDI bean,应用程序基于 JSF2 和 Hibernate。
当你有一个 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);
}
我正在使用 Maven 多模块项目。 我将我的逻辑分为不同的层,表示层、业务逻辑层、数据层,每一层都在一个单独的模块(层)中。 当我尝试插入一个对象时,出现了这个异常:
org.hibernate.MappingException: Unknown entity: com.xxxxx.service.model.Object$Proxy$_$$_WeldClientProxy
这是怎么引起的,我该如何解决?
我正在使用 CDI bean,应用程序基于 JSF2 和 Hibernate。
当你有一个 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);
}