【问题标题】: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

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

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

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

【问题讨论】:

    标签: java hibernate annotations


    【解决方案1】:

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

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

    【讨论】:

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