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 имеет один конструктор аргументов, который принимает строку. Эта строка я хочу сохранить в базе данных как часть всей записи. Я вижу

org.hibernate.InstantiationException: нет конструктора по умолчанию для объекта: RecipientDetailsList

исключение, когда я пытаюсь сохранить объект. У меня есть два вопроса:

  • Есть ли у нас какая-нибудь работа над этим исключением? Я не могу изменить класс, поскольку он предназначен для JAXB marshalling/unmarhsalling. Могу ли я каким-либо образом сохранить объекты без изменения структуры? Кроме того, меня интересует только сохранение первой записи списка, на который ссылается recipientDetails, поскольку я хочу только одну строку для объекта. Я хочу, чтобы он игнорировал остальные записи, если у него более 1 записи. Возможно ли это?

  • Является ли этот хороший дизайн использовать аннотацию непосредственно в классах, которые генерируются JAXB? Должен ли я создавать другие классы (и, возможно, mappers/converters) только для хранения и извлечения информации?

Ответ 1

Для вашего первого вопроса: это происходит потому, что, когда Hibernate пытается создать bean, он делает это через отражение. Он создает объект, вызывая конструктор no-arg, а затем используя методы setter для установки свойств. Вы не можете использовать bean, у которого нет конструктора no-arg.

Во втором вопросе: если что-то другое создало для вас классы, у которых нет конструктора no-arg, на самом деле ваш единственный вариант (если вы не можете изменить класс) заключается в создании обертки вокруг него или подкласс, который имеет конструктор no-arg. Я не вижу другого способа сделать это, если вы не можете изменить класс напрямую. Но подклассификация должна быть прекрасной, если у вас есть класс, достаточный обзор методов (т.е. Не имеет частных методов, к которым вы не можете добраться).

Ответ 2

Если вы отметите RecipientDetails как @Embeddable hibernate будет использовать конструктор с аргументами.

@Embeddable
class RecipientDetails {

    //no default constructor

    public RecipientDetails(some arg) {}


}