当前位置: 首页 > 知识库问答 >
问题:

Hibernate无参数构造函数

周超英
2023-03-14

我正在浏览hibernate留档,文档说hibernate需要为我们所有的持久类提供一个no-arg构造函数:

无参数构造函数是所有持久类的要求;Hibernate必须使用Java反射为您创建对象。构造器可以是私有的,但是在没有字节码插装的情况下,运行时代理生成和有效的数据检索需要包或公共可见性。

但是当我通过创建一个没有任何无参数构造函数的POJO类并放置一个接受参数的构造函数来创建一个示例程序进行测试时,我预计Hibernate会抛出一个异常,但我惊讶地发现我没有得到异常。

以下是我的建议:

public class Event {
    private Long id;

    private String title;

    public Event(String title) {}

    public Long getId() {
        return id;
    }

    private void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

以下是我的节目:

import org.hibernate.Session;
import java.util.*;
import org.hibernate.tutorial.domain.Event;
import org.hibernate.tutorial.util.HibernateUtil;

public class EventManager {
    public static void main(String[] args) {
        EventManager mgr = new EventManager();
        mgr.createAndStoreEvent("My Event", new Date());
        HibernateUtil.getSessionFactory().close();
    }

    private void createAndStoreEvent(String title, Date theDate) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Event theEvent = new Event("");
        theEvent.setTitle(title);
        theEvent.setDate(theDate);
        session.save(theEvent);
        session.getTransaction().commit();
    }
}

我还配置了hibernate配置和映射文件。现在我可以看到,当我执行这个程序时,一条新记录存储在我的数据库中。

我是Hibernate的新手,请帮助我理解hibernate留档中给出的语句,因为文档说我们需要一个no-arg构造函数。我正在使用Hibernate 3. x版本。

共有2个答案

钱哲茂
2023-03-14

你试试这个,你就会得到例外。

   Event  event = (Event)session.get(Event.class, eventId );

在事件类中添加默认构造函数

public class Event {

     public Event(){
     } 

}
吴修洁
2023-03-14

尝试阅读你的事件,你会看到异常。

当通过显式调用构造函数已经创建了对象时,问题不在于将对象保存在数据库中。问题在于hibernate从数据库读取记录时,必须创建映射类的相应对象。在这种情况下,它应该创建对象。没有默认构造函数,它怎么能做到呢?实际上,可以有几个带参数的构造函数,而它“不知道”该取哪个。

它是这样做的:

Object obj = Class.forName(mappedClassName).newInstance();
pupulateProperties(obj);

newInstance()不需要参数构造函数。

 类似资料:
  • 在经历冬眠3时。x文档我知道我们也可以为具有私有可见性的POJO声明一个无arg构造函数,但文档说它有限制: 无参数构造函数是所有持久类的要求;Hibernate必须使用Java反射为您创建对象。构造器可以是私有的,但是在没有字节码插装的情况下,运行时代理生成和有效的数据检索需要包或公共可见性。 我不熟悉Hibernate,我试图了解何时使用运行时代理,何时使用字节码,以及这在Hibernate中

  • 实际上,我不明白无参数构造函数和默认构造函数的区别是什么。 在创建名为cFrame的Test对象时,是否调用此类的默认构造函数?

  • 问题内容: 必须使用无参数构造函数(像Hibernate这样的工具会在此构造函数上使用反射来实例化对象)。 我得到了这个手挥手的答案,但是有人可以进一步解释吗?谢谢 问题答案: hibernate,并且通常通过反射创建对象的代码用于创建类的新实例。此方法需要一个公共的无参数构造函数才能实例化该对象。对于大多数用例,提供无参数构造函数不是问题。 有一些基于序列化的技巧可以解决没有no-arg构造函数

  • 最近,我将Paho MQTT Spy项目导入Eclipse。导入结束时出现错误: 为什么我会收到这条信息,这意味着什么?怎么修? 我正在使用Java13.0.1 我试图用maven构建项目,得到了同样的错误。 我添加了下面的依赖项到pom.xml 现在pom.xml如下所示: Maven给出了错误: UPD Java8解决了问题,但我仍然试图使java 13与它一起工作。 正在尝试使用下面定义的p

  • 下面是引用的Spring留档的AutoowiredAnnotationBeanPostProc处理器, 任何给定bean类中只有一个构造函数(最大值)可以携带此注释,其中“必需”参数设置为true,指示构造函数在用作Spring bean时自动连接。如果多个非必需的构造函数携带注释,它们将被视为自动连接的候选。将选择具有最多依赖项的构造函数,这些依赖项可以通过匹配Spring容器中的bean来满足

  • 问题内容: 其实我不明白,无参数构造函数和默认构造函数有什么区别。 创建名为cFrame的Test对象时,这是否调用此类的默认构造函数? 问题答案: 该构造函数是一个无参数的构造函数,代表您的Java编译器插入; 它包含对(not )的调用,这是默认行为。如果实现任何构造函数,则不再收到默认的构造函数。 JLS-8.8.9。默认构造函数说(部分), 如果一个类不包含构造函数声明,则隐式声明一个没有