簡體   English   中英

Hibernate Annotations:沒有實體的默認構造函數

[英]Hibernate Annotations : No default constructor for entity

我試圖堅持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編組/ unmarhsalling而設計的。 我可以以某種方式存儲對象而不改變結構嗎? 此外,我感興趣的是只存儲recipientDetails引用的列表的第一條記錄,因為我只想要一行對象。 如果它有超過1條記錄,我希望它忽略其余的記錄。 可能嗎?

  2. 這個好的設計是否可以直接將注釋用於由JAXB生成的類中? 我應該創建另一個類(可能還有mappers /轉換器)來存儲和檢索信息嗎?

對於你的第一個問題:這種情況正在發生,因為當Hibernate嘗試創建一個bean時,它會通過反射來實現。 它通過調用no-arg構造函數創建對象,然后使用setter方法設置屬性。 您不能使用沒有no-arg構造函數的bean。

對於第二個問題:如果其他東西為你生成了沒有no-arg構造函數的類,那么你唯一的選擇(如果你不能修改類)就是創建一個包裝它的包裝器,或者是一個子類有一個無參數的構造函數。 如果你不能直接修改類,我沒有看到任何其他方法。 但是,只要你獲得的類對方法有足夠的可見性(即,沒有你無法獲得的私有方法),子類化應該沒問題。

如果將RecipientDetails標記為@Embeddable hibernate將使用帶參數的構造函數。

@Embeddable
class RecipientDetails {

    //no default constructor

    public RecipientDetails(some arg) {}


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM