2017-11-25 4 views
0

folgende JPA Entity Gegeben:Eclipse Auto erzeugt Integer statt Dezimal für H2 Datenbank

@Table(name = "T_BOOK") 
@Entity 
@NamedQueries({ 
     @NamedQuery(name = Book.FIND_BY_ISBN_QUERY.QUERY_NAME, query = Book.FIND_BY_ISBN_QUERY.QUERY_STRING) 
}) 
public class Book extends BaseEntity { 

    public static class FIND_BY_ISBN_QUERY { 
     public static final String QUERY_NAME = "Book.findByISBN"; 
     public static final String QUERY_STRING = "select new ch.bfh.eadj.dto.BookInfo(b.isbn, b.authors, b.title, b.price) from Book b where b.isbn = :isbn"; 
    } 

    @Column(nullable = false) 
    private String isbn; 

    private String authors; 

    @Column(nullable = false) 
    private String title; 

    @Column(nullable = false) 
    private BigDecimal price; 

Das Schema Generation erzeugt die Anweisung erstellen folgende:

CREATE TABLE T_BOOK (NR BIGINT IDENTITY NOT NULL, AUTHORS VARCHAR, BINDING VARCHAR,ISBN VARCHAR NOT NULL, PRICE NUMERIC(38) NOT NULL, TITLE VARCHAR NOT NULL, VERSION INTEGER, PRIMARY KEY (NR)) 

Also das Preisfeld sieht wie folgt aus: PRICE NUMERIC(38) NOT NULL

Warum erstellt EclipseLink einen nicht-dezimalen numerischen Wert?

Sobald ich @Column(precision = 8, scale = 2) in das Feld price hinzufügen, funktioniert es wie erwartet und erstellt PRICE NUMERIC(8,2) NOT NULL.

Sind die Attribute und scale auf BigDecimal Spalten erforderlich, wenn automatisch ein Schema generiert wird?

+0

H2 schafft was es vom JPA-Anbieter zu schaffen ist. Wundern Sie sich, welchen Sie verwenden – DN1

+0

Vielen Dank für den Hinweis. Der Anbieter wurde der Frage hinzugefügt. Es ist 'EclipseLink' –

+0

Standardmäßig konfiguriert der EclipseLink-Persistenzanbieter automatisch eine grundlegende Zuordnung für einfache Typen. Wenn Sie Annotationen wie: '@ Column',' @ Basic' usw. verwenden, können Sie Ihre Mappings feineinstellen. – newOne

Antwort

0

Der Grund ist, dass gemäß der JDBC-Spezifikation BigDecimal zu numerisch zuordnet. ohne die Skala der Standard-Skala spezifiziert ist 0.

ZIFFERN (38) (oder in Datenbanken wie Oracle NUMBER (38)) in der Datenbank der max-Wert für diesen Datentyp ist:

38 significant digits in the range of -(10**125) to +(10**125).