一尘不染

Hibernate注释:实体没有默认的构造函数

hibernate

我试图保留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该类具有一个参数构造函数,它接受一个String。我想将该字符串作为整个记录的一部分保留在数据库中。我看到了

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

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

  1. 我们是否有任何例外处理方法?我无法更改类,因为它是为JAXB编组/解组设计的。我能以某种方式存储对象而不改变结构吗?另外,我只想存储对象的一行,所以只对收件人详细信息引用的列表的第一条记录感兴趣。我希望它忽略多条记录(如果有多条记录)。可能吗?

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


阅读 274

收藏
2020-06-20

共1个答案

一尘不染

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

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

2020-06-20