休眠注释:实体没有默认构造函数

Posted

技术标签:

【中文标题】休眠注释:实体没有默认构造函数【英文标题】:Hibernate Annotations : No default constructor for entity 【发布时间】:2014-10-16 14:28:20 【问题描述】:

我正在尝试持久化 JAXB 生成的对象。这是示例结构:

@Column(name = "reporting_identifier")
private String reportingIdentifier;
@Column(name = "apply_quiet_time")
private boolean applyQuietTime;
@Embedded
private RecipientDetailsList recipientDetailsList;

下面是RecipientDetailsList类的结构:

@ElementCollection(targetClass=String.class)
private List<RecipientDetails> recipientDetails;

现在,RecipientDetails 类有一个参数构造函数,它接受一个字符串。我想将该字符串作为整个记录的一部分保留在数据库中。我看到了

org.hibernate.InstantiationException:没有实体的默认构造函数:RecipientDetailsList

尝试保存对象时出现异常。我有两个问题:

    我们有解决这个异常的方法吗?我无法更改该类,因为它是为 JAXB 编组/解组而设计的。我可以在不改变结构的情况下以某种方式存储对象吗?另外,我有兴趣只存储引用的列表的第一条记录 recipientDetails 因为我只想要一行对象。如果它有超过 1 条记录,我希望它忽略其余记录。有可能吗?

    将注解直接用于由 JAXB 生成的类中是否是好的设计?我是否应该创建另一个类(可能还有映射器/转换器)来存储和检索信息?

【问题讨论】:

【参考方案1】:

对于您的第一个问题:这是因为当 Hibernate 尝试创建一个 bean 时,它是通过反射来完成的。它通过调用无参数构造函数来创建对象,然后使用 setter 方法设置属性。您不能使用没有无参数构造函数的 bean。

对于第二个问题:如果其他东西为您生成了没有无参数构造函数的类,那么您唯一的选择(如果您无法修改该类)是围绕它创建一个包装器,或者具有无参数构造函数的子类。如果您不能直接修改类,我看不到任何其他方法。但是,只要您拥有的类对方法有足够的可见性(即没有您无法访问的私有方法),子类化就应该没问题。

【讨论】:

感谢您的回复。我不应该创建一个包含这些类的所有字段的另一个类吗? 不太清楚你的意思。如果您基本上是指复制您拥有的类、字段和所有内容,并添加一个无参数构造函数,那么只要您知道基础类永远不会改变,那么这将起作用。然而,通常生活并不是那么简单。如果可以的话,子类化将是更好的选择。 @user3968762 如果回答有用,请点击勾选接受。 成功了!一个 bean 总是需要一个默认的构造函数。谢谢:D

以上是关于休眠注释:实体没有默认构造函数的主要内容,如果未能解决你的问题,请参考以下文章

InstantiationException:在 Kotlin 中使实体字段不可为空时,没有实体的默认构造函数

线程“主”javax.persistence.PersistenceException 中的异常:org.hibernate.InstantiationException:实体没有默认构造函数:[重复

休眠一对多注释外键空

Flutter 6种构造函数详解

构造方法

错误 C2512 但我有可用的默认构造函数