3

変更できないテーブルに対して次のSQL定義があります

CREATE TABLE network_model_property (
    id                NUMBER           NOT NULL PRIMARY KEY,
    name              VARCHAR2(100)    NOT NULL,
    ....        
    max               NUMBER(10),
    min               NUMBER(10),
    ....
)

JPAによるクラス定義は次のとおりです。

@Entity
@Table(name = "network_model_property")
@SequenceGenerator(name = "PropertySeq", sequenceName = "MODEL_PROPERTY_SEQUENCE")
public class ModelProperty implements Serializable {

    static final long serialVersionUID = -3276944825572313129L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PropertySeq")
    @Column(name = "id")
    private Long id;

    @Column(name = "max")
    private Double max;

    @Column(name = "min")
    private Double min;


    public Double getMax() {
        return max;
    }

    public void setMax(Double max) {
        this.max = max;
    }

    public Double getMin() {
        return min;
    }

    public void setMin(Double min) {
        this.min = min;
    }

'hibernate.hbm2ddl.auto=validate'が設定されている場合にこの例外をスローする単純なテストケースを実行しています

Caused by: javax.persistence.PersistenceException: [PersistenceUnit: assure] Unable to build EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:132)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:224)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:291)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334)
    ... 33 more
Caused by: org.hibernate.HibernateException: Wrong column type in POCOWN1.NETWORK_MODEL_PROPERTY for column max. Found: number, expected: double precision
    at org.hibernate.mapping.Table.validateColumns(Table.java:284)
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1116)
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:139)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:349)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1327)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)
    ... 38 more

そして、私は試しました

@Column(name = "max", columnDefinition="Decimal(10,2) default '100.00'")

@Column(name = "max",precision=10, scale=2)
4

5 に答える 5

4

テーブル定義では、max列とmin列に精度が指定されていますが、スケールはありません。maxおよびminプロパティの列JPA定義でscale=0を使用してみてください。

于 2012-04-05T13:53:14.490 に答える
2

非常に長い時間がかかりましたが、完全を期すために、最も簡単な修正は、JPAエンティティを定義された最小値と最大値に変更することjava.math.BigDecimalです。java.math.BigIntegerおよび型は、SQLおよびデータ型のjava.math.BigDecimal直接変換を提供します。NumericNumber

それ以外の場合、値を正しくマップするには、JDBCネイティブ型変換用のDBドライバーを参照して、Javaでjdbc型が何に変換されるかを判別する必要があります。

于 2014-09-15T22:49:43.230 に答える
0

はい、スケールを指定しない場合、jpaはそれを数値型に変換します。したがって、スケールと精度を指定することをお勧めします。したがって、クラスをモデル化するときはいつでも、スケールが0であっても、スケールと精度を指定します。0として指定します。乾杯!

于 2012-06-21T05:07:44.077 に答える
0

私の場合、データベースは私の定義でうまく機能し、検証だけが失敗しました。「auto=none」を使用してみてください。

于 2017-08-27T13:57:43.527 に答える
0

次のように、精度とスケールおよびcolumnDefinitionも指定する必要があります。

@Column(name = "max", precision = 10, scale = 0, columnDefinition = "NUMBER (10)")

private double variation;
于 2019-09-03T16:38:50.143 に答える