Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hibernate jpa java.lang.ClassCastException:model.Dog不能强制转换为model.Dog_Java_Hibernate_Jpa_Classnotfoundexception - Fatal编程技术网

hibernate jpa java.lang.ClassCastException:model.Dog不能强制转换为model.Dog

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

我有一个奇怪的例外,我不知道为什么。我在内存中有数据库中的列表,但当我试图访问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 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)
两个JAR都包含
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;
}