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) {}
}