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

时间:2014-08-22 16:53:31

标签: java hibernate annotations

我试图坚持JAXB生成的对象。以下是示例结构:

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

以下是RecipientDetailsList class:

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

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

  

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

我尝试保存对象时出现

异常。我有两个问题:

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

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

2 个答案:

答案 0 :(得分:29)

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

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

答案 1 :(得分:0)

如果将RecipientDetails标记为@Embeddable,hibernate将使用带有参数的构造函数。

@Embeddable
class RecipientDetails {

    //no default constructor

    public RecipientDetails(some arg) {}


}