Каков правильный тип данных для сопоставления BigInt без знака MySQL с классом объектов Java с использованием Hibernate?

#hibernate #jpa #orm #hibernate-mapping

#спящий режим #jpa #orm #hibernate-сопоставление

Вопрос:

Я использую 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)]  
  

Итак, у меня есть следующая таблица с именем acccomodation:

 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                                            
  

Предыдущая таблица сопоставлена этим классом размещения:

 @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 моей таблицы размещения, отображенной в соответствующем поле id класса размещения.

Проблема, по-видимому, заключается в том, что, используя BigInteger в качестве типа поля id в сопоставленном классе, я должен использовать десятичное число (19,2) в поле id таблицы. Но я думаю, что это нехорошо, потому что первичным ключом таблицы должен быть беззнаковый BigInt в БД.

Итак, какой тип данных Java я должен использовать в своем классе, чтобы правильно сопоставить этот беззнаковый BigInt?

как вы можете видеть в предыдущих 2 фрагментах кода

Ответ №1:

Вы должны иметь возможность сопоставлять Mysql тип bigint (20) с Java primitive long, например:

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

Однако, согласно этой документации, вы также должны уметь использовать java.math.BigInteger.

Моя рекомендация — проверить версию вашего драйвера.