Проблема с гибернацией при сопоставлении подклассов - создание экземпляра туплайзера по умолчанию

У меня есть класс пользователя и класс сотрудника, в котором класс сотрудника расширяется, и класс пользователя. Кроме того, у меня есть класс адресов, который является отношением HAS-A к обоим классам. Ниже приведены классы реализации и ошибки. Я получаю сообщение об ошибке.

Модель пользователя

  public class User {
    private int userid;
    private String username;
    private String password;
    private Date dob;
    private String gender;
    private Set<Address> addresses;
//getter and setters
}

Модель сотрудника

public class Employee extends User {
    private Date joindate;
    private String role;
    private Branch branch;
//getter and setters
}

Модель адреса

public class Address {
    private String email;
    private String mobile;
    private String street;
    private String city;
    private String state;
    private String country;
    private String pin;
//getter & setters
}

users.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name = "com.alok.mypro.model.usermodel.User" table = "myuser" schema = "mydb">
        <id name = "userid">
            <generator class = "increment" />
        </id>
        <property name = "username" />
        <property name = "password" />
        <property name = "dob" />
        <property name = "gender" />
        <set name = "addresses" cascade = "all">
            <key column = "userid" />
            <one-to-many class = "com.alok.mypro.model.usermodel.Address" />
        </set>

        <joined-subclass name = "com.alok.mypro.model.usermodel.Employee" table = "employee">
            <key column = "userid" />
            <property name = "joindate" />
            <property name = "role" />
            <many-to-one name = "branch" class = "com.alok.mypro.model.places.Branch"/>
        </joined-subclass>

    </class>
</hibernate-mapping>

address.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name = "com.alok.mypro.model.usermodel.Address" table = "address"
        schema = "myuser">

        <id name = "email" />
        <property name = "mobile" />
        <property name = "street" />
        <property name = "city" />
        <property name = "state" />
        <property name = "country" />
        <property name = "pin" />
    </class>
</hibernate-mapping>

Исключение при строительстве


Exception in thread "main" org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer] at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:108) at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:133) at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.(EntityEntityModeToTuplizerMapping.java:80) at org.hibernate.tuple.entity.EntityMetamodel.(EntityMetamodel.java:322) at org.hibernate.persister.entity.AbstractEntityPersister.(AbstractEntityPersister.java:485) at org.hibernate.persister.entity.JoinedSubclassEntityPersister.(JoinedSubclassEntityPersister.java:126) at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:87) at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:286) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) at Test.main(Test.java:7)

Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:105)

Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for addresses in class com.alok.mypro.model.usermodel.Employee at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:326) at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:320) at org.hibernate.mapping.Property.getGetter(Property.java:304) at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:297) at org.hibernate.tuple.entity.AbstractEntityTuplizer.(AbstractEntityTuplizer.java:155) at org.hibernate.tuple.entity.PojoEntityTuplizer.(PojoEntityTuplizer.java:77) ... 14 more

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
244
1

Ответы 1

Ошибка связана с отсутствующим свойством получения.

Вы должны добавить следующий код в класс Address

public Set<Address> getAddresses() {
        return addresses;
    }

кроме того, проверьте, есть ли у вас свойство setter.

private void setAddresses(Set<Address> addresses) {
    this.addresses = addresses;
}

Hibernate в основном нуждается в свойствах получателя и установщика для атрибутов, которые необходимо сохранить, как описано в https://docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html/ch02.html#domainmodel-pojo-accessors.

Вы должны сделать установщик закрытым, чтобы обеспечить инкапсуляцию данных вашего класса во время изменений.

Есть геттеры и сеттеры. Однако Getter и Setter для адреса должны быть в модели пользователя, но проблема отображается в модели сотрудника. {Причина: org.hibernate.PropertyNotFoundException: не удалось найти геттер для адресов в классе com.alok.mypro.model.usermodel.Employee at}

Alok Ray 01.06.2018 05:57

Я не могу воспроизвести проблему. Не могли бы вы поделиться своим файлом конфигурации Hibernate hibernate.cfg.xml?

baymax 01.06.2018 10:57

Другие вопросы по теме