使用java实体类自动生成Hibernate映射文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用java实体类自动生成Hibernate映射文件相关的知识,希望对你有一定的参考价值。

最近在研究Hibernate。
通过IDE简化可以做到
通过现有的数据库,自动生成映射文件,自动生成实体类;
用过现有的映射文件,自动创建数据库,自动生成实体类。
问题:
如何实现 通过现有实体类,自动生成映射文件;(自动生成数据库)
也就是前面两种的逆向;

用MyEclipse自动生成Hibernate映射文件及实体:
1、 创建数据库,创建相应的表,
2、 点击图标,选择MyEclipse Datebase Explorer,
3、 右击空白区域,选择new菜单,根据提示创建数据库连接,创建好后会显示你所创建的连接名,如图mysqldb是我创建的数据库连接,
4、 选择需要添加hibernate映像文件的工程右击--->MyEclipse-->Add Hibernate Capabilities,
5、 根据提示下一步,不需要改动东西,
6、 选择刚刚创建的数据库连接名,继续下一步,最后finish,
7、 刚刚自动生成的东西,有HibernateSessionFactory.java 和 hibernate.cfg.xml,
8、 到MyEclipse Datebase Explorer中刚刚新建的数据库连接选中所有表,点击右键--->Hibernate Reverse Enginnering 选中目录存放将要反转出来的实体类查看是否选中Update Hibernate configuration..若没有自己勾选一下,下一步,可以设置每张表中id增长方式(assigned代表要人为指定,为了方便可以空着让系统决定),及生成的映射文件名称,
注意事项:Class name要指定完整的包名assigned代表要人为指定,为了方便可以空着让系统决定。
9、 回到my eclipse enterprise视图下,所有实体类以及配置文件已生成。
参考技术A Myeclipse 可以通过实体类和映射文件生成数据表 但是貌似不能生成数据库 也就是说你只要创建一下数据库就可以了本回答被提问者采纳 参考技术B 可以做到,网上也有相关资料,不过不推荐这样做。比如关联关系、表结构会有一些奇怪的问题。
了解一下就好。
参考技术C 你可以通过实体和映射文件生成数据库。

使用Hibernate在Java实体类上映射MySql无符号BigInt的正确数据类型是什么?

我正在使用Hibernate将MySql表映射到实体类。启动应用程序,我遇到此表实体映射错误:

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [id] in table [accomodation]; found [bigint (Types#BIGINT)], but expecting [decimal(19,2) (Types#NUMERIC)]  

所以我有下表名为accommodation:

Field                                                            Type       Null Key Default    Extra                      
---------------------------------------------------------------------------------------------------------------------------
id                                                               bigint(20) unsigned NO   PRI            auto_increment             
user_id                                                          bigint(20) unsigned NO   MUL                                       
accomodation_name                                                varchar(255) NO                                             
description                                                      text       NO                                             
nation                                                           varchar(255) NO                                             
region                                                           varchar(255) NO                                             
province                                                         varchar(255) NO                                             
city                                                             varchar(255) NO                                             
geographical_position                                            point      NO                                             
stars                                                            int(10)    NO                                             
accomodation_typological_id                                      bigint(20) unsigned YES                                            
accomodation_service_id                                          bigint(20) unsigned YES                                            
tell                                                             varchar(255) YES                                            
mobile                                                           varchar(255) YES                                            
fax                                                              varchar(255) YES                                            
email                                                            varchar(255) YES                                            
time_stamp                                                       datetime   YES                                            

上一个表由此Accomodation类映射:

@Entity
@Table(name = "accomodation")
public class Accomodation implements Serializable {


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

    /*@ManyToOne
    private Users users;
    */

    @OneToMany(mappedBy = "accomodation")
    private List<Room> rooms;

    private String name;
    private String description;
    private String phone;
    private String mobile;
    private String fax;
    private String email;
    private Integer stars;
    private Double longitude;
    private Double latitude;

    // CONSTRUCTOR AND GETTER AND SETTER METHODS
    ...........................................................
    ...........................................................
    ...........................................................

}

因此,读取错误似乎在我的住宿表的id字段上存在映射错误,映射在Accomodation类的相关id字段上。

问题似乎是使用BigInteger作为映射类的id字段的类型我必须在表的id字段上使用decimal(19,2)。但我认为它不好,因为表的主键应该是DB上的无符号BigInt。

那么我可以在我的类中使用什么Java数据类型来正确映射这个未签名的BigInt?

正如您在前面的2个代码段中看到的那样

答案

您应该能够将Mysql类型bigint(20)映射到Java原始long,例如:

@Entity
@Table(name = "accomodation")
public class Accomodation implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;

但是根据this documentation,您还应该能够使用java.math.BigInteger。

我的建议是检查驱动程序的版本。

以上是关于使用java实体类自动生成Hibernate映射文件的主要内容,如果未能解决你的问题,请参考以下文章

《Java从入门到放弃》入门篇:使用注解的方式配置hibernate映射关系

生成 hibernate 映射文件和实体类

数据库怎么映射生成java实体类

Hibernate主键生成策略

反向生成hibernate实体类和映射文件

使用Hibernate在Java实体类上映射MySql无符号BigInt的正确数据类型是什么?