我试图坚持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
异常。我有两个问题:
我们是否有解决此异常的任何工作?我无法更改类,因为它是为JAXB编组/ unmarhsalling而设计的。我可以以某种方式存储对象而不改变结构吗?另外,我感兴趣的是只存储引用列表的第一条记录 recipientDetails因为我只想要一行对象。如果它有超过1条记录,我希望它忽略其余的记录。有可能吗?
这个好的设计是否可以直接将注释用于由JAXB生成的类中?我应该创建另一个类(可能还有mappers /转换器)来存储和检索信息吗?
答案 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) {}
}