hibernate jpa java.lang.ClassCastException:model.Dog不能强制转换为model.Dog
我有一个奇怪的例外,我不知道为什么。我在内存中有数据库中的列表,但当我试图访问getter或将实体保存在变量中时,它会引发异常 以下是实体:hibernate jpa java.lang.ClassCastException:model.Dog不能强制转换为model.Dog,java,hibernate,jpa,classnotfoundexception,Java,Hibernate,Jpa,Classnotfoundexception,我有一个奇怪的例外,我不知道为什么。我在内存中有数据库中的列表,但当我试图访问getter或将实体保存在变量中时,它会引发异常 以下是实体: package model; import java.io.Serializable; import javax.persistence.*; @Entity @NamedQuery(name="Dog.findAll", query="SELECT d FROM Dog d") public class Dog implements Serializ
package model;
import java.io.Serializable;
import javax.persistence.*;
@Entity
@NamedQuery(name="Dog.findAll", query="SELECT d FROM Dog d")
public class Dog implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
public Dog() {
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
这是我的会话bean实现:
@Stateless(name = "mytable")
public class TableBean implements TableLocal {
@PersistenceContext(unitName = "sample")
private EntityManager manager;
@Override
public Dog getAll() {
Dog h = manager.find(Dog.class, 1);
Hibernate.initialize(h);
return h;
}
@Override
@SuppressWarnings("unchecked")
public List<Dog> findAll() {
Query query = manager.createQuery("SELECT h FROM Dog h",Dog.class);
List<Dog> col = query.getResultList();
Hibernate.initialize(col);
return col;
}
@Override
public void addDog() {
Dog d = new Dog();
//d.setId(2);
d.setName("chappy");
manager.persist(d);
}
}
和my persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="sample">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>MySQL</jta-data-source>
<class>model.Dog</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.hbm2ddl" value="update" />
<property name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
org.hibernate.jpa.HibernatePersistenceProvider
MySQL
模特,狗
您很可能有两个罐子:
- 一个用于web
- 一个用于核心服务(例如EJB)
model.Dog
类,应用服务器从两个不同的源加载同一类的两个版本。当核心层向web层发送model.Dog
响应时,响应在核心层中加载了一个类版本,而web层已经有了该类的不同运行时版本,因此会出现异常
要解决这个问题,您只需要在核心层中包含实体,web层应该依赖于核心层人工制品,而不是包含实体本身
更新
同时删除以下内容:
Hibernate.initialize(h);
因为它在您的特定用例中没有任何价值。在您的findAll()
方法中,使用TypedQuery而不是Query。
原因是,TypedQuery的getResultList()
正在返回类型化列表的列表。i、 e.在您的情况下,List
但是查询的getResultList返回原始List
您可以尝试使用以下代码:-
@Override
@SuppressWarnings("unchecked")
public List<Dog> findAll() {
TypedQuery<Dog> query = manager.createQuery("SELECT h FROM Dog h",Dog.class);
List<Dog> col = query.getResultList();
Hibernate.initialize(col);
return col;
}
@覆盖
@抑制警告(“未选中”)
公共列表findAll(){
TypedQuery query=manager.createQuery(“从Dog h中选择h”,Dog.class);
List col=query.getResultList();
Hibernate.initialize(col);
返回列;
}
这看起来像是classloder问题。您的服务器类路径中有两次包含model.Dog类的jar吗?可能是这样。我在后端的web模块中有一个依赖项,在后端和web的服务器模块中也有一个依赖项。我应该给出提供的范围吗?我正在使用maven在GlassFishBuild和deploy上进行构建和部署。这两个文件都位于哪里?你指的是哪些文件?在web pom中包含model.Dog
的JAR我依赖于提供范围的后端。我应该在哪里找罐子?在拥挤的战争或耳朵里。在那里,您只需搜索model.Dog
,查看该类是否有两次出现。在后端ejb模块中只有一次出现。在web模块中,我没有任何model.dog。我认为它是hibernate,因为我改为使用Eclipse链接,现在它可以工作。检查我的更新并尝试不使用hibernate.initialize()
前面提到的TypedQuery解决方案对我很有效。还有一件事,既然您已经声明了@NamedQuery
,为什么还要再次创建查询。findAll()
中的代码应该是这样的,TypedQuery query=manager.createQuery(“Dog.findAll”,Dog.class)代码>相同的错误。也许我的persistence.xml错了?我补充了这个问题。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="sample">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>MySQL</jta-data-source>
<class>model.Dog</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.hbm2ddl" value="update" />
<property name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
Hibernate.initialize(h);
@Override
@SuppressWarnings("unchecked")
public List<Dog> findAll() {
TypedQuery<Dog> query = manager.createQuery("SELECT h FROM Dog h",Dog.class);
List<Dog> col = query.getResultList();
Hibernate.initialize(col);
return col;
}