当前位置: 首页 > 知识库问答 >
问题:

hibernate在创建表时如何排列列?

仇承志
2023-03-14

我已经使用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;
}
import javax.persistence.Embeddable;

@Embeddable
public class Address {
private String street;
private String city;
private String state;
private String pincode;
}
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中添加哪些列有什么规则吗?

共有1个答案

佟阳焱
2023-03-14

HBM to ddl库使用反射来获取类中的字段,根据文档,字段的顺序没有得到保留/保证:

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

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

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

 类似资料:
  • 问题内容: 我是Android开发人员的新手,但仍然可以做很多事情。 我有一个使用以下代码显示的主菜单,但无法确定如何禁用菜单中的选定项目。有人可以帮我一些示例代码吗? 我的strings.xml文件中有一个: 谢谢 问题答案: 为了在创建列表时禁用列表项,您必须从继承。您必须重写以下方法:和。在以前,您返回或取决于列表项在给定位置是否启用。在后者中,您返回。 如果要使用,则还必须实现该方法,因为

  • 我正在尝试创建列表列表,其中大列表表示纸张包含小列表表示问题的集合,问题列表由问题字符串及其ID组成。在这里我的代码: 现在我没有错误地制作问题列表,但是当我尝试创建更大的列表时,Visual Studio无法将可变问题类型识别为类型,哪里错了?

  • 问题内容: 这是我的pojo,注为实体 等等...... 上面的实体是使用注释创建的,当我查看mysql数据库时,没有按顺序创建列,而是在下面编写的,相反,第一列是book_id,然后是book_desc,然后是book_athor,然后是book_short_desc,然后是book_name。 我的问题是如何告诉hibernate以与我在Java代码中编写的顺序相同的顺序创建列? 有没有任何注

  • 我不熟悉java和springboot。我正在尝试使用springboot创建一个CRUD应用程序。我使用MySQL存储数据。 员工模式- 员工资源库- 员工控制员- 上面的控制器在JSON对象数组表单中给出了结果,如下所示 但我需要以下表格的回复 非常感谢你的帮助。

  • 我有一个映射到视图的实体,下面是它的外观 这工作得很好,我可以使用道从视图中检索记录。然而,我在日志中注意到Hibernate实际上正在尝试创建表,但失败了,因为它已经存在。 2015-11-12 21:56:34.841错误4204---[ost-startStop-1]组织。冬眠工具hbm2ddl。SchemaExport:HHH000389:不成功:创建表user\u profile(use

  • 问题内容: 我有一堂课 我有一个返回List对象的方法,例如 我需要像这样将列表转换为JSONArray 谁能帮我得到这个?在此先感谢.. 问题答案: 我认为您无需下载Jettison jar文件。 使用,您可以轻松地将该列表转换为JSON对象,例如@Juniad Answer