【问题标题】:How does hibernate arranges column while creating a table?hibernate在创建表时如何排列列?
【发布时间】:2016-06-08 15:17:32
【问题描述】:

我使用 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 对象包含有关地址的详细信息,例如城市、密码、街道和州。

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

在hibernate中添加列有什么规则吗?

【问题讨论】:

  • 我相信它会按照反射返回相应字段的顺序添加列,即。 e.没有特别的顺序
  • @SashaSalauyou:反射是什么意思?
  • 简而言之,这是通过名称操作类/对象成员的Java API。 stackoverflow.com/questions/37628/…

标签: java sql hibernate postgresql create-table


【解决方案1】:

hbm to ddl library 使用反射来获取类中的字段,并且根据文档,不保留/保证字段的顺序:

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getFields()

返回一个包含反映所有字段对象的数组 由 this 表示的类或接口的可访问公共字段 类对象。 返回的数组中的元素没有排序,并且 没有任何特定的顺序。此方法返回一个数组 如果类或接口没有可访问的公共字段,则长度为 0,或者 如果它表示数组类、原始类型或 void。

在编写依赖反射的库时,我也遇到过类似的问题。

【讨论】:

  • 我已尝试重新编译并再次执行。它仍然以相同的方式添加列。
  • 谜团或反思! “不按特定顺序”与“不按一致顺序”不同。你只是不应该依赖这个排序。
  • Hibernate 有没有办法以特定方式添加列?
  • 据我所知,这似乎是一个已知限制 (forum.hibernate.org/viewtopic.php?p=2396344)。我个人只使用hbm2ddl 来生成初始架构,然后根据需要对其进行修改(通常有一些问题需要修复!)。
  • 是不是说在使用hbm2ddl之后,我们需要先对表的列进行排序,然后再导入任何数据到表中?
猜你喜欢
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2021-09-30
  • 1970-01-01
  • 2011-09-05
  • 2013-12-17
  • 2011-01-12
相关资源
最近更新 更多