Java JPA-SQLException创建记录

Java JPA-SQLException创建记录,java,oracle,jpa,netbeans,eclipselink,Java,Oracle,Jpa,Netbeans,Eclipselink,我已经从数据库中导入了这个实体类(使用数据库中的Netbeans函数-实体类) 不幸的是,我不能让它工作 IMS\U测量表 INSTALLED_IMS_ID - NUMBER(9) MEASUREMENT_IMS_ORD - NUMBER(9) MEASUREMENT_TYPE_ID - NUMBER(9) DEVICE_ID - NUMBER(9) MEASUREMENT_TIME - TIMESTAMP(3) MEASUREMENT_VALUE - NUMBER(9,2) MEASUREME

我已经从数据库中导入了这个实体类(使用数据库中的Netbeans函数-实体类)

不幸的是,我不能让它工作

IMS\U测量表

INSTALLED_IMS_ID - NUMBER(9)
MEASUREMENT_IMS_ORD - NUMBER(9)
MEASUREMENT_TYPE_ID - NUMBER(9)
DEVICE_ID - NUMBER(9)
MEASUREMENT_TIME - TIMESTAMP(3)
MEASUREMENT_VALUE - NUMBER(9,2)
MEASUREMENT_MAX_VALUE - NUMBER(9,2)
MEASUREMENT_MIN_VALUE - NUMBER(9,2)
NOTES - VARCHAR(255 BYTE)
PREVIOUS_INFO - NUMBER(5)
LAST_UPDATE - TIMESTAMP(3)
MEASUREMENT_PRECISION - NUMBER(2)
LOCALIZATION_ID - NUMBER(9) 
主键是(已安装的IMS\U ID、测量IMS\U ORD)

ImsMeasurements.java

@Entity
public class ImsMeasurements implements Serializable {
    @EmbeddedId
    protected ImsMeasurementsPK imsMeasurementsPK;

    @Column(name = "MEASUREMENT_TYPE_ID")
    private Integer measurementTypeId;
    @Basic(optional = false)
    @Column(name = "MEASUREMENT_TIME")
    @Temporal(TemporalType.TIMESTAMP)
    private Date measurementTime;
    @Column(name = "MEASUREMENT_VALUE")
    private BigDecimal measurementValue;
    @Column(name = "MEASUREMENT_MAX_VALUE")
    private BigDecimal measurementMaxValue;
    @Column(name = "MEASUREMENT_MIN_VALUE")
    private BigDecimal measurementMinValue;
    @Column(name = "NOTES")
    private String notes;
    @Column(name = "PREVIOUS_INFO")
    private Integer previousInfo;
    @Column(name = "LAST_UPDATE")
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdate;
    @Column(name = "MEASUREMENT_PRECISION")
    private Short measurementPrecision;
    @Column(name = "LOCALIZATION_ID")
    private Integer localizationId;
    ....
    ....

    //constructors
    public ImsMeasurements() {
    }

    public ImsMeasurements(ImsMeasurementsPK imsMeasurementsPK) {
        this.imsMeasurementsPK = imsMeasurementsPK;
    }

    public ImsMeasurements(ImsMeasurementsPK imsMeasurementsPK, Date measurementTime) {
        this.imsMeasurementsPK = imsMeasurementsPK;
        this.measurementTime = measurementTime;
    }

    public ImsMeasurements(int installedImsId, int measurementImsOrd) {
        this.imsMeasurementsPK = new ImsMeasurementsPK(installedImsId, measurementImsOrd);
    }
}
@Embeddable
public class ImsMeasurementsPK implements Serializable {
    @Basic(optional = false)
    @Column(name = "INSTALLED_IMS_ID")
    private int installedImsId;

    @Basic(optional = false)
    @Column(name = "MEASUREMENT_IMS_ORD")
    private int measurementImsOrd;
    ....

    //constructors
    public ImsMeasurementsPK() {
    }

    public ImsMeasurementsPK(int installedImsId, int measurementImsOrd) {
        this.installedImsId = installedImsId;
        this.measurementImsOrd = measurementImsOrd;
    }
}
ImsMeasurementsPK.java

@Entity
public class ImsMeasurements implements Serializable {
    @EmbeddedId
    protected ImsMeasurementsPK imsMeasurementsPK;

    @Column(name = "MEASUREMENT_TYPE_ID")
    private Integer measurementTypeId;
    @Basic(optional = false)
    @Column(name = "MEASUREMENT_TIME")
    @Temporal(TemporalType.TIMESTAMP)
    private Date measurementTime;
    @Column(name = "MEASUREMENT_VALUE")
    private BigDecimal measurementValue;
    @Column(name = "MEASUREMENT_MAX_VALUE")
    private BigDecimal measurementMaxValue;
    @Column(name = "MEASUREMENT_MIN_VALUE")
    private BigDecimal measurementMinValue;
    @Column(name = "NOTES")
    private String notes;
    @Column(name = "PREVIOUS_INFO")
    private Integer previousInfo;
    @Column(name = "LAST_UPDATE")
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdate;
    @Column(name = "MEASUREMENT_PRECISION")
    private Short measurementPrecision;
    @Column(name = "LOCALIZATION_ID")
    private Integer localizationId;
    ....
    ....

    //constructors
    public ImsMeasurements() {
    }

    public ImsMeasurements(ImsMeasurementsPK imsMeasurementsPK) {
        this.imsMeasurementsPK = imsMeasurementsPK;
    }

    public ImsMeasurements(ImsMeasurementsPK imsMeasurementsPK, Date measurementTime) {
        this.imsMeasurementsPK = imsMeasurementsPK;
        this.measurementTime = measurementTime;
    }

    public ImsMeasurements(int installedImsId, int measurementImsOrd) {
        this.imsMeasurementsPK = new ImsMeasurementsPK(installedImsId, measurementImsOrd);
    }
}
@Embeddable
public class ImsMeasurementsPK implements Serializable {
    @Basic(optional = false)
    @Column(name = "INSTALLED_IMS_ID")
    private int installedImsId;

    @Basic(optional = false)
    @Column(name = "MEASUREMENT_IMS_ORD")
    private int measurementImsOrd;
    ....

    //constructors
    public ImsMeasurementsPK() {
    }

    public ImsMeasurementsPK(int installedImsId, int measurementImsOrd) {
        this.installedImsId = installedImsId;
        this.measurementImsOrd = measurementImsOrd;
    }
}
设置测量值

//setting measure primary key    
ImsMeasurements mis = new ImsMeasurements(new ImsMeasurementsPK(1, 1));
....
坚持下去

em.persist(mis);
我发现这种java.sql.SQLException:ORA-01438:值大于此列允许的指定精度

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-01438: value larger than specified precision allowed for this column

Error Code: 1438
Call: INSERT INTO SICURFER.IMS_MEASUREMENTS (LAST_UPDATE, LOCALIZATION_ID, MEASUREMENT_MAX_VALUE, MEASUREMENT_MIN_VALUE, MEASUREMENT_PRECISION, MEASUREMENT_TIME, MEASUREMENT_TYPE_ID, MEASUREMENT_VALUE, NOTES, PREVIOUS_INFO, MEASUREMENT_IMS_ORD, INSTALLED_IMS_ID, DEVICE_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    bind => [13 parameters bound]
Query: InsertObjectQuery(com.ansaldosts.sic.dao.ImsMeasurements[ imsMeasurementsPK=com.ansaldosts.sic.dao.ImsMeasurementsPK[ installedImsId=1, measurementImsOrd=1 ] ])
JPA提供者->EclipseLink,版本:EclipsePersistenceServices-2.2.0.v20110202-r8913

我尝试插入的值:

mis.setMeasurementValue(BigDecimal.valueOf(110));
mis.setMeasurementTypeId(10);
String s = "2014-04-17 12:05:00";
Date date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.ITALY).parse(s);
mis.setMeasurementTime(date);
mis.setMeasurementPrecision(Short.MIN_VALUE);
mis.setMeasurementMinValue(BigDecimal.ZERO);
mis.setMeasurementMaxValue(BigDecimal.ZERO);
mis.setLocalizationId(Integer.valueOf(10));
mis.setDeviceId(2);
mis.setImsSystems(110);    
问题出在哪里,我错在哪里

提前感谢,,
Francesco

有三个字段使用“BigDecimal”类型,可能会变大。您需要检查数据库中每一列的类型。

对象中有一个值
ImsMeasurements
比表中指定的列长。这是一个可行的解决方案,谢谢。您可以找出[13个参数绑定]是什么吗?添加值和ddl。我认为问题出在从bin ImsMeasurementsPK到DB上的主复合键的映射上,但我不理解原因。映射是使用Netbeans函数(“从类创建实体”)从JPA自动生成的。我不知道Netbeans,所以我无法在这方面帮助您。谢谢!我以您可以观察从JPA自动生成的DB数据类型和相对类型的方式编辑问题。有什么奇怪的吗?有些不一致?似乎测量精度-数字(2)有问题。它的长度仅为2,但您已使用Short.MIN_值设置了一个值,即-32768,其长度为5。