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

2022-09-01 14:08:42

我正在尝试持久化 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;

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

org.hibernate.InstantiationException: No default constructor for entity: RecipientDetailsList

异常,当我尝试保存一个对象。我有两个问题:

  1. 我们是否有任何解决此异常的方法?我无法更改该类,因为它是为 JAXB 编组/取消元组化而设计的。我可以在不改变结构的情况下以某种方式存储对象吗?另外,我感兴趣的是只存储收件人详细信息引用的列表的第一条记录,因为我只想要一行用于对象。我希望它忽略其余的记录,如果它有超过1条记录。可能吗?

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


答案 1

对于你的第一个问题:这种情况正在发生,因为当Hibernate试图创建一个豆子时,它通过反射来实现。它通过调用 no-arg 构造函数,然后使用 setter 方法来设置属性来执行对象创建。不能使用没有 no-arg 构造函数的 Bean。

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


答案 2

推荐