Не знайдено серіалізатора для класу org.hibernate.proxy.pojo.javassist.Javassist?


94

Я працюю над SpringMVC, Hibernate& JSONале я отримую цю помилку.

HTTP Status 500 - Could not write JSON: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) ) 

Будь ласка, перевірте мою організацію нижче

    @Entity
@Table(name="USERS")
public class User {

    @Id
    @GeneratedValue
    @Column(name="USER_ID")
    private Integer userId;

    @Column(name="USER_FIRST_NAME")
    private String firstName;

    @Column(name="USER_LAST_NAME")
    private String lastName;


    @Column(name="USER_MIDDLE_NAME")
    private String middleName;

    @Column(name="USER_EMAIL_ID")
    private String emailId;

    @Column(name="USER_PHONE_NO")
    private Integer phoneNo;

    @Column(name="USER_PASSWORD")
    private String password;

    @Column(name="USER_CONF_PASSWORD")
    private String  confPassword;

    @Transient
    private String token;

    @Column(name="USER_CREATED_ON")
    private Date createdOn;

    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinTable(name = "USER_ROLES", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
    private List<ActifioRoles> userRole = new ArrayList<ActifioRoles>();


    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy="userDetails")
    @Fetch(value = FetchMode.SUBSELECT)
    private List<com.actifio.domain.Address> userAddress = new ArrayList<com.actifio.domain.Address>();

    @OneToOne(cascade=CascadeType.ALL)
    private Tenant tenantDetails;


    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmailId() {
        return emailId;
    }
    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getConfPassword() {
        return confPassword;
    }
    public void setConfPassword(String confPassword) {
        this.confPassword = confPassword;
    }
    public Date getCreatedOn() {
        return createdOn;
    }
    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }

    public List<ActifioRoles> getUserRole() {
        return userRole;
    }

    public void setUserRole(List<ActifioRoles> userRole) {
        this.userRole = userRole;
    }
    public String getMiddleName() {
        return middleName;
    }
    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }
    public Integer getPhoneNo() {
        return phoneNo;
    }
    public void setPhoneNo(Integer phoneNo) {
        this.phoneNo = phoneNo;
    }

    public List<com.actifio.domain.Address> getUserAddress() {
        return userAddress;
    }
    public void setUserAddress(List<com.actifio.domain.Address> userAddress) {
        this.userAddress = userAddress;
    }
    public Tenant getTenantDetails() {
        return tenantDetails;
    }
    public void setTenantDetails(Tenant tenantDetails) {
        this.tenantDetails = tenantDetails;
    }
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }

    }

Як я можу це вирішити?


Будь ласка, покажіть стек стек і код, де відбувається виняток
geoі

Не маючи жодних знань про те, що намагається зробити ваш код, налагодити його трохи складно, але ви, мабуть, захочете перевірити github.com/FasterXML/jackson-datatype-hibernate, оскільки ви використовуєте Jackson and Hibernate
geoand

Ви намагаєтесь створити JSON із цього класу? У цьому випадку серіалізатор JSON намагається записати всі властивості, а також HashSet ваших відносин багато-до-багатьох; це робить ледачий виняток ініціалізатора
Анджело Іммедіата

те саме запитання можна знайти на stackoverflow.com/questions/4362104/…
Matrix Buster

@ user2963481 ... Приємне і дуже корисне запитання, брате.
Мозок,

Відповіді:


192

У мене була подібна проблема з лінивим завантаженням через сплячий об’єкт сплячого режиму. Обійшов це, анотуючи клас із ледаче завантаженими приватними властивостями:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

Я припускаю, що ви можете додати властивості вашого проксі-об'єкта, що порушує серіалізацію JSON, до цієї анотації.

Проблема в тому, що сутності завантажуються ліниво, і серіалізація відбувається до того, як вони завантажаться повністю.

Hibernate.initialize(<your getter method>);

3
Це спрацювало і у мене ... Чи є пояснення цій дивній поведінці?
Віктор

7
@ ankur-singhal, слід наголосити, що ця анотація потрібна для вкладеного класу, а НЕ викликаючого класу.
Дарвейн

1
Yahooo ... це спрацювало. Я пробував кілька разів і працював. Я пробував кілька способів і BoooM. Працювали.
Brain

2
Подяка спрацювала і на мене. Вам потрібно додати цю анотацію до сутностей, які отримують доступ до інших сутностей, що мають ліниво завантажені боби.
Шафкат Шафі

3
Я думаю, що це не правильне рішення проблеми. Коли ми проводимо серіалізацію, ми очікуємо, що або повний суб’єкт, або принаймні первинний ключ під-об’єкта повернеться назад у результаті. Додавання цих анотацій лише придушить помилку, але не забезпечить бажаних результатів.
Ананд

84

Щоб додати це, я зіткнувся з тим самим питанням, але надані відповіді не спрацювали. Я виправив це, прийнявши пропозицію щодо виключення та додавши до файлу application.properties ...

spring.jackson.serialization.fail-on-empty-beans=false

Я використовую Spring Boot v1.3 з Hibernate 4.3

Тепер він серіалізує весь об’єкт та вкладені об’єкти.

РЕДАКТУВАТИ: 2018

Оскільки це все ще отримує коментарі, я поясню тут. Це абсолютно лише приховує помилку. Наслідки продуктивності є. У той час мені потрібно було щось доставити і попрацювати над цим пізніше (що я зробив, не використовуючи більше пружини). Так що так, слухайте когось іншого, якщо ви дійсно хочете вирішити проблему. Якщо ви просто хочете, щоб його зараз не було, використовуйте цю відповідь. Це жахлива ідея, але, чорт вазьміть, це може допомогти вам. На протокол, після цього ніколи більше не виникало аварійне завершення роботи. Але це, мабуть, джерело того, що в кінцевому підсумку стало кошмаром продуктивності SQL.


8
Вирішує проблему, але json буде містити два зайвих непотрібних властивості"handler":{},"hibernateLazyInitializer":{}
майже уникайте

чудово! Виправлено і тут, це відповідь
Хіноторі

@prettyvoid Чому існують додаткові властивості?
Роберт Мун

12
@RobertMoon Якщо ви хочете позбутися їх, ви можете анотувати свою організацію@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
уникайте

@prettyvoid Дякую. Я знайшов інше рішення - змінити LAZY на EAGER. Це впливає на продуктивність?
Роберт Мун

69

Як було правильно запропоновано в попередніх відповідях, "ліниве завантаження" означає, що коли ви отримуєте свій об'єкт із бази даних, вкладені об'єкти не отримуються (і можуть бути отримані пізніше, коли це потрібно).

Тепер Джексон намагається серіалізувати вкладений об'єкт (== зробити з нього JSON), але не вдається, оскільки він знаходить JavassistLazyInitializer замість звичайного об'єкта. Це помилка, яку ви бачите. Тепер, як це вирішити?

Як пропонувалося раніше CP510, одним із варіантів є придушення помилки за допомогою цього рядка конфігурації:

spring.jackson.serialization.fail-on-empty-beans=false

Але це стосується симптомів, а не причини . Щоб вирішити це елегантно, вам потрібно вирішити, потрібен вам цей об’єкт у JSON чи ні?

  1. Якщо вам потрібен об’єкт у JSON, видаліть FetchType.LAZYпараметр із поля, яке його спричиняє (це також може бути поле в якомусь вкладеному об’єкті, а не лише в кореневій сутності, яку ви отримуєте).

  2. Якщо об’єкт у JSON вам не потрібен, анотуйте отримувач цього поля (або саме поле, якщо вам також не потрібно приймати вхідні значення) @JsonIgnore, наприклад:

    // this field will not be serialized to/from JSON @JsonIgnore private NestedType secret;

Якщо у вас є більш складні потреби (наприклад, різні правила для різних контролерів REST, що використовують одну й ту саму сутність), ви можете використовувати перегляди Джексона або фільтрацію, або для дуже простого випадку, отримати вкладені об'єкти окремо.


16
Це найкраща відповідь. Вирішіть корінь проблеми, а не просто замаскуйте симптоми для наступного програміста, з яким доведеться мати справу.
Ендрю

2
Ви - мій герой.
Lay Leangsros

велике спасибі, що пояснили причину помилки та надали два
Маурісіо Поппе,

Дякую за це, проте я бачу, що RangeError: Maximum call stack size exceeded
springfox-swagger

18

Ви можете використовувати додатковий модуль для Джексона, який обробляє Hibernate ліниве завантаження.

Більше інформації на https://github.com/FasterXML/jackson-datatype-hibernate, яка підтримує сплячий режим 3 та 4 окремо.


7
Це має бути справді правильною відповіддю. Усі інші відповіді приховують проблему, а не вирішують її.
Ахмед Хассаньєн

Але як користуватися цим модулем? чи є для цього якийсь путівник?
Ананд

Способи налаштування jackson-datatype-hibernate: stackoverflow.com/q/33727017
Чейз

13

Я думаю, що проблема полягає в тому, як ви отримуєте сутність.

Можливо, ви робите щось подібне:

Person p = (Person) session.load(Person.class, new Integer(id));

Спробуйте використовувати метод getзамістьload

Person p = (Person) session.get(Person.class, new Integer(id));

Проблема в тому, що за допомогою методу навантаження ви отримуєте лише проксі, але не реальний об’єкт. Об'єкт проксі не має властивостей, які вже завантажені, тому, коли відбувається серіалізація, немає властивостей для серіалізації. За допомогою методу get ви фактично отримуєте реальний об'єкт, насправді цей об'єкт може бути серіалізований.


2
Дуже подібна помилка трапилася зі мною, коли я використовував getOne замість findOne. У моєму випадку моє сховище інтерфейсу розширювало JpaRepository. findOne добре працював без жодних анотацій Json або змін у застосуванні. властивості
Джеймс Фрейтас,

Як і Джеймс Фрейтас, я також виявив, що getOne призвів до проблеми, і використовуючи замість цього, наприклад, findById - вирішив проблему без необхідності використовувати анотацію або наведений вище рядок у властивостях програми
МОЯ

1
Мій колега пояснив мене і сказав, що: "Основна відмінність полягає в тому, що getOne ледаче завантажується, а findOne - ні" - мається на увазі, очевидно, що перший фактично не отримує рядки даних з db, а просто створює посилання. Останній, натомість, фактично отримує рядки, що часто буває бажаним
МОЯ

@JamesFreitas ТАК! Дякую! І дякую Карлосу, що підвів Джеймса до цього гарного висновку!
Філіп Савіч

9

це працює для мене

@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})

напр

@Entity
@Table(name = "user")
@Data
@NoArgsConstructor
@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private Date created;

}

5

Вирішити проблему можна двома способами.

Шлях 1 :

Додайте spring.jackson.serialization.fail-on-empty-beans=falseдо application.properties

Шлях 2 :

Використання join fetchв запиті JPQL для отримання даних батьківського об’єкта, див. Нижче:

@Query(value = "select child from Child child join fetch child.parent Parent ",
           countQuery = "select count(*) from Child child join child.parent parent ")
public Page<Parent> findAll(Pageable pageable); 

Дякую! Перше рішення - це чудово!
Лукас Мояно Анджеліні

Шлях 1. Чудовий. Дякую.
Lay Leangsros

3

Додайте цю Анотацію до Класу Сутності (Моделі), яка працює для мене, це спричиняє ліниве завантаження через сплячий об’єкт сплячого режиму.

@JsonIgnoreProperties ({"hibernateLazyInitializer", "handler"})


2

Цей виняток

org.springframework.http.converter.HttpMessageNotWritableException

отримання, тому що, сподіваюсь, ви надсилаєте результат відповіді як об’єкт, що серіалізується.
Ця проблема виникає навесні. Щоб вирішити цю проблему, надішліть об’єкт POJO як результат виводу.

Приклад:

    @Entity
    @Table(name="user_details")
    public class User implements Serializable{

        @Id
        @GeneratedValue(strategy= GenerationType.IDENTITY)
        @Column(name="id")
        private Integer id;

        @Column(name="user_name")
        private String userName;

        @Column(name="email_id")
        private String emailId;

        @Column(name="phone_no")
        private String phone;

//setter and getters

Клас POJO:

public class UserVO {

    private int Id;
    private String userName;
    private String emailId;
    private String phone;
    private Integer active;

//setter and getters

У контролері перетворіть поля об'єкта, що серизуються, у поля класу POJO і поверніть клас pojo як вихідний результат.

         User u= userService.getdetials(); // get data from database

        UserVO userVo= new UserVO();  // created pojo class object

        userVo.setId(u.getId());
        userVo.setEmailId(u.getEmailId());
        userVo.setActive(u.getActive());
        userVo.setPhone(u.getPhone());
        userVo.setUserName(u.getUserName());
       retunr userVo;  //finally send pojo object as output.

Так, я роблю те саме, але навіть роблячи те саме, я отримую ту саму помилку, оскільки я надсилаю пов'язані з об'єктами дані, що є нічим іншим, як встановленням класів Entity
Pra_A

2

У режимі глибокого сну 5.2 та новіших версій ви можете видалити сплячий режим, як показано нижче, і він надасть вам фактичний об’єкт, щоб ви могли правильно його серіалізувати:

Object unproxiedEntity = Hibernate.unproxy( proxy );

він також автоматично зателефонує Hibernate.initializeзаздалегідь.
GMsoF,

@Tim, його слід додати перед серіалізацією json. Проблема трапилася через те, що під час серіалізації було виявлено сплячий об’єкт сплячого режиму, тому після його видалення серіалізація буде нормальною. Якщо ви використовуєте пружинний контролер, то вам доведеться зробити це до кінця контролера.
GMsoF

1

Для Hibernate ви можете використовувати проект jackson-datatype-hibernate, щоб забезпечити серіалізацію / десеріалізацію JSON із завантаженими ледачим об'єктами.

Наприклад,

import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonDatatypeHibernate5Configuration {

    // Register Jackson Hibernate5 Module to handle JSON serialization of lazy-loaded entities
    // Any beans of type com.fasterxml.jackson.databind.Module are automatically
    // registered with the auto-configured Jackson2ObjectMapperBuilder
    // https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper
    @Bean
    public Module hibernate5Module() {
        Hibernate5Module hibernate5Module = new Hibernate5Module();
        hibernate5Module.enable( Hibernate5Module.Feature.FORCE_LAZY_LOADING );
        hibernate5Module.disable( Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION );
        return hibernate5Module;
    }
}

Якщо я використовував це, то я отримую can't parse JSON. Raw result:. Будь-яка допомога?
Pra_A

1

Рішення натхнено наведеним нижче рішенням від @marco. Я також оновив його відповідь цими даними.

Проблема тут полягає у ледачому завантаженні під-об’єктів, де Джексон знаходить лише сплячі проксі-сервери, замість повномасштабних об’єктів.

Отже, у нас залишається два варіанти - придушити виняток, як це зроблено вище у більшості відповідей, що проголосували тут, або переконатися, що об’єкти LazyLoad завантажені.

Якщо ви вирішите скористатися останнім варіантом, рішенням буде використання бібліотеки jackson-datatype та налаштування бібліотеки для ініціалізації залежностей для ледачого навантаження до серіалізації.

Для цього я додав новий клас конфігурації.

@Configuration
public class JacksonConfig extends WebMvcConfigurerAdapter {

@Bean
@Primary
public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper mapper = new ObjectMapper();
    Hibernate5Module module = new Hibernate5Module();
    module.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING);
    mapper.registerModule(module);
    messageConverter.setObjectMapper(mapper);
    return messageConverter;
}

}

@Primaryпереконуєсь, що жодна інша конфігурація Джексона не використовується для ініціалізації будь-яких інших компонентів. @Beanяк завжди.module.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING);полягає в увімкненні Ледачого завантаження залежностей.

Увага! Будь ласка, слідкуйте за його наслідками. іноді EAGER fetch допомагає, але навіть якщо ви робите це нетерплячим, вам все одно знадобиться цей код, оскільки об'єкти проксі все ще існують для всіх інших відображень, за винятком@OneToOne

PS: Як загальний коментар, я б заохотив практику надсилання цілих об'єктів даних назад у відповіді Json. Для цього потрібно використовувати Dto і використовувати для відображення їх як mapper, наприклад mapstruct. Це позбавляє вас від випадкових лазівок у безпеці, а також вищезазначеного винятку.


1

Зараз у мене така сама проблема. перевірте, чи ви виправляєте отримання в лінивому за допомогою @jsonIQgnore

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="teachers")
@JsonIgnoreProperties("course")
Teacher teach;

Просто видаліть "(fetch = ...)" або анотацію "@jsonIgnore", і це буде працювати

@ManyToOne
@JoinColumn(name="teachers")
@JsonIgnoreProperties("course")
Teacher teach;

0

Або ви можете налаштувати mapper як:

// спеціальна конфігурація для ледачого завантаження

public static class HibernateLazyInitializerSerializer extends JsonSerializer<JavassistLazyInitializer> {

    @Override
    public void serialize(JavassistLazyInitializer initializer, JsonGenerator jsonGenerator,
            SerializerProvider serializerProvider)
            throws IOException, JsonProcessingException {
        jsonGenerator.writeNull();
    }
}

та налаштувати mapper:

    mapper = new JacksonMapper();
    SimpleModule simpleModule = new SimpleModule(
            "SimpleModule", new Version(1,0,0,null)
    );
    simpleModule.addSerializer(
            JavassistLazyInitializer.class,
            new HibernateLazyInitializerSerializer()
    );
    mapper.registerModule(simpleModule);

0

Проблемою можуть бути ваші відносини сутності Hibernate ... просто припиніть ліниве завантаження цієї пов’язаної сутності ... наприклад ... Я вирішив це нижче, встановивши lazy = "false" для customerType.

<class name="Customer" table="CUSTOMER">
        <id name="custId" type="long">
            <column name="CUSTID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="phone" type="java.lang.String">
            <column name="PHONE" />
        </property>
        <property name="pan" type="java.lang.String">
            <column name="PAN" />
        </property>

        <many-to-one name="customerType" not-null="true" lazy="false"></many-to-one>
    </class>
</hibernate-mapping>

1
будь ласка, повідомте у своєму дописі, що це може бути дуже небезпечним рішенням у реальному житті.
панург

0

Я змінився (у класі моделі анотації)

fetch = FetchType.LAZY

до

fetch = FetchType.EAGER

і працював досить мило ...

Любіть це.


5
Хоча це і вирішує проблему, це дуже небезпечно. Зміна fetchстратегії на моделі має кілька наслідків для продуктивності. Завдяки цій зміні ви приносите набагато більше даних із бази даних. Це може бути дійсним рішенням, але спочатку необхідне дослідження ефективності.
Джоау Менігін,

1
Якщо ви знаєте, що ви модель, і не маєте багато пов’язаних сутностей, ви можете витратити трохи пам’яті та виступу, щоб отримати повну сутність. але добре знати, що завжди найкраще використовувати LAZY fetch
Sham Fiorin

0

Це проблема з Джексоном. Щоб запобігти цьому, вкажіть Джексону не серіалізувати вкладені відносини або вкладений клас.

Подивіться на наступний приклад. Адресний клас, зіставлений із класами міста , штату та країни, а сам штат вказує на країну та країну, що вказує на регіон. Коли ви отримуєте значення адрес через Spring boot REST API, ви отримаєте вищевказану помилку. Щоб запобігти цьому, просто серіалізуйте зіставлений клас (який відображає рівень JSON першого рівня) та ігноруйте вкладені зв'язки з @JsonIgnoreProperties(value = {"state"}),@JsonIgnoreProperties(value = {"country"}) і @JsonIgnoreProperties(value = {"region"})

Це запобіжить виключенню Lazyload разом із вищезазначеною помилкою. Використовуйте наведений нижче код як приклад і змініть класи класів.

Адреса.java

@Entity
public class Address extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 4203344613880544060L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "street_name")
    private String streetName;

    @Column(name = "apartment")
    private String apartment;

    @ManyToOne
    @JoinColumn(name = "city_id")
    @JsonIgnoreProperties(value = {"state"})
    private City city;

    @ManyToOne
    @JoinColumn(name = "state_id")
    @JsonIgnoreProperties(value = {"country"})
    private State state;

    @ManyToOne
    @JoinColumn(name = "country_id")
    @JsonIgnoreProperties(value = {"region"})
    private Country country;

    @ManyToOne
    @JoinColumn(name = "region_id")
    private Region region;

    @Column(name = "zip_code")
    private String zipCode;

    @ManyToOne
    @JoinColumn(name = "address_type_id", referencedColumnName = "id")
    private AddressType addressType;

}

Місто.ява

@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "city")
@Cache(region = "cityCache",usage = CacheConcurrencyStrategy.READ_WRITE)
@Data
public class City extends AbstractAuditingEntity
{
    private static final long serialVersionUID = -8825045541258851493L;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    //@Length(max = 100,min = 2)
    private String name;


    @ManyToOne
    @JoinColumn(name = "state_id")
    private State state;
}

State.java

@Entity
@Table(name = "state")
@Data
@EqualsAndHashCode(callSuper = true)
public class State extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 5553856435782266275L;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "code")
    private String code;

    @Column(name = "name")
    @Length(max = 200, min = 2)
    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "country_id")
    private Country country;

}

Країна.java

@Entity
@Table(name = "country")
@Data
@EqualsAndHashCode(callSuper = true)
public class Country extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 6396100319470393108L;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    @Length(max = 200, min = 2)
    private String name;

    @Column(name = "code")
    @Length(max = 3, min = 2)
    private String code;

    @Column(name = "iso_code")
    @Length(max = 3, min = 2)
    private String isoCode;

    @ManyToOne
    @JoinColumn(name = "region_id")
    private Region region;
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.