Как hibernate упорядочивает столбец при создании таблицы?

Я использовал Hibernate для отображения объектов Java в базу данных PostgreSQL. Класс UserDetails - это класс сущностей, используемый для добавления пользователя. Он содержит встроенный объект с именем Address.

UserDetails.java

@Entity
@Table(name="USER_DETAILS")
public class UserDetails {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="USER_ID")
    private int userId;
    @Column(name="USER_NAME")
    private String userName;
    @Temporal(TemporalType.DATE)
    @Column(name="JOINED_DATE")
    private Date joinedDate;
    @Column(name="DESCRIPTION")
    private String description;
    @Embedded
    private Address address;
}

Адресный объект содержит подробную информацию об адресе, такую ​​как город, пин-код, улица и штат.

Address.java

import javax.persistence.Embeddable;

@Embeddable
public class Address {
private String street;
private String city;
private String state;
private String pincode;
}

Класс, содержащий метод main ниже:

public class HibernateTest {
    public static void main(String[] args){
    UserDetails user = new UserDetails();
    UserDetails user1 = new UserDetails();

    user.setUserName("First User");

    Address newAddress = new Address();
    newAddress.setCity("Pune");
    newAddress.setPincode("411057");
    newAddress.setState("Maharashtra");
    newAddress.setStreet("Hinjewadi");

    user.setAddress(newAddress);
    user.setDescription("just like that");
    user.setJoinedDate(new Date());     
    user1.setUserName("Second User");
    user1.setDescription("great here");
    user1.setJoinedDate(new Date());

    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    session.save(user);
    session.save(user1);
    session.getTransaction().commit();
    session.close();

    user = null;

    session = sessionFactory.openSession();
    session.beginTransaction();
    user = session.get(UserDetails.class, 1);
    System.out.println(user.getUserName());
    session.close();
    sessionFactory.close();
}
}

Сгенерированный запрос SQL, как показано ниже, показывает, что столбцы не добавляются в том же порядке, в котором они были объявлены.

Hibernate: create sequence hibernate_sequence start 1 increment 1
Hibernate: create table USER_DETAILS (USER_ID int4 not null, city varchar(255), pincode varchar(255), state varchar(255), street varchar(255), DESCRIPTION varchar(255), JOINED_DATE date, USER_NAME varchar(255), primary key (USER_ID))

Есть ли правило, в котором столбцы добавляются в спящий режим?

1 ответ

Решение

hbm to ddl library использует отражение для получения полей внутри класса, и согласно документации порядок полей не сохраняется / не гарантируется:

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

Возвращает массив, содержащий объекты Field, отражающие все доступные открытые поля класса или интерфейса, представленные этим объектом Class. Элементы в возвращаемом массиве не отсортированы и расположены не в определенном порядке. Этот метод возвращает массив длины 0, если у класса или интерфейса нет доступных открытых полей или если он представляет класс массива, примитивный тип или void.

Я сталкивался с подобными проблемами, когда речь шла о написании библиотек, основанных на рефлексии.

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