Ошибка преобразования типа данных nvarchar в десятичную ошибку при обновлении объекта гибернации - PullRequest
2 голосов
/ 15 марта 2012

У меня есть приложение JSF, использующее спящий режим.
Я загружаю набор точек для многоугольника и хочу обновить точки.

Я обновляю информацию о точке, но когда я пытаюсь зафиксировать изменения, я получаю следующую ошибку:

    WARNING: SQL Error: 8114, SQLState: S0005
    SEVERE: Error converting data type nvarchar to decimal.
    SEVERE: Could not synchronize database state with session
    org.hibernate.exception.SQLGrammarException: could not update: [hibernate.TbPolygonPoint#937]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)

Я в замешательстве, поскольку у меня нет информации о символах в объекте, который я пытаюсь обновить.

Кто-нибудь знает, почему я получаю эту ошибку и как ее устранить? Спасибо.

Вот код обновления. Я получаю сообщение об ошибке при попытке сделать коммит:

    public int updatePolygonPoint( long polyPointId, int sGroup, int group, double lat, double lon )
    {
        int stat = 0;
        TbPolygonPoint point = null;
        try
       {
            BigDecimal bdLat = new BigDecimal(lat);
            BigDecimal bdLon = new BigDecimal(lon);
            org.hibernate.Transaction tx = session.beginTransaction();
            point = (TbPolygonPoint)session.get(TbPolygonPoint.class, polyPointId);
            point.setIsuperGroupId(sGroup);
            point.setIgroupId(group);
            point.setDcLatitude(bdLat);
            point.setDcLongitude(bdLon);
            try
            {
                session.update(point);
                tx.commit();
                this.session = HibernateUtil.getSessionFactory().openSession();
                stat = 1;
            }
            catch(Exception e)
            {
                tx.rollback();
                e.printStackTrace();
                status = e.getMessage();
                stat = -1;
            }
        }
        catch( Exception ex )
        {
             ex.printStackTrace();
            status = ex.getMessage();
            stat = -1;
        }
        return stat;
    }

Вот код Java для объекта.

    import java.math.BigDecimal;
    import java.util.HashSet;
    import java.util.Set;

    /**
    * TbPolygonPoint generated by hbm2java
    */
    public class TbPolygonPoint  implements java.io.Serializable {


        private long biPolygonPointId;
        private TbPolygonLoadFile tbPolygonLoadFile;
        private int isuperGroupId;
        private int igroupId;
        private BigDecimal dcLatitude;
        private BigDecimal dcLongitude;
        private Set<TbPolygonHasPoints> tbPolygonHasPointses = new HashSet<TbPolygonHasPoints>(0);

        public TbPolygonPoint() {
        }


        public TbPolygonPoint(long biPolygonPointId, int isuperGroupId, int igroupId, BigDecimal dcLatitude, BigDecimal dcLongitude) {
            this.biPolygonPointId = biPolygonPointId;
            this.isuperGroupId = isuperGroupId;
            this.igroupId = igroupId;
            this.dcLatitude = dcLatitude;
            this.dcLongitude = dcLongitude;
        }
        public TbPolygonPoint(long biPolygonPointId, TbPolygonLoadFile tbPolygonLoadFile, int isuperGroupId, int igroupId, BigDecimal dcLatitude, BigDecimal dcLongitude, Set<TbPolygonHasPoints> tbPolygonHasPointses) {
        this.biPolygonPointId = biPolygonPointId;
        this.tbPolygonLoadFile = tbPolygonLoadFile;
        this.isuperGroupId = isuperGroupId;
        this.igroupId = igroupId;
        this.dcLatitude = dcLatitude;
        this.dcLongitude = dcLongitude;
        this.tbPolygonHasPointses = tbPolygonHasPointses;
        }

        public long getBiPolygonPointId() {
            return this.biPolygonPointId;
        }

        public void setBiPolygonPointId(long biPolygonPointId) {
            this.biPolygonPointId = biPolygonPointId;
        }
        public TbPolygonLoadFile getTbPolygonLoadFile() {
            return this.tbPolygonLoadFile;
        }

        public void setTbPolygonLoadFile(TbPolygonLoadFile tbPolygonLoadFile) {
            this.tbPolygonLoadFile = tbPolygonLoadFile;
        }
        public int getIsuperGroupId() {
            return this.isuperGroupId;
        }

        public void setIsuperGroupId(int isuperGroupId) {
            this.isuperGroupId = isuperGroupId;
        }
        public int getIgroupId() {
            return this.igroupId;
        }

        public void setIgroupId(int igroupId) {
            this.igroupId = igroupId;
        }
        public BigDecimal getDcLatitude() {
            return this.dcLatitude;
        }

        public void setDcLatitude(BigDecimal dcLatitude) {
            this.dcLatitude = dcLatitude;
        }
        public BigDecimal getDcLongitude() {
            return this.dcLongitude;
        }

        public void setDcLongitude(BigDecimal dcLongitude) {
            this.dcLongitude = dcLongitude;
        }
        public Set<TbPolygonHasPoints> getTbPolygonHasPointses() {
            return this.tbPolygonHasPointses;
        }

        public void setTbPolygonHasPointses(Set<TbPolygonHasPoints> tbPolygonHasPointses) {
            this.tbPolygonHasPointses = tbPolygonHasPointses;
        }
    }

1 Ответ

11 голосов
/ 16 марта 2012

Я нашел ответ здесь:

http://dertompson.com/2008/01/03/bigdecimal-and-jdbc-since-java-5-0-2/

Очевидно, процесс преобразования преобразует двойное число в строку, которая может содержать слишком много значений после десятичного числа.Затем он преобразуется в BigDecimal.В этом процессе преобразования и происходит ошибка.

Я решил эту проблему, используя decimalFormat (), чтобы сохранить количество значащих цифр, которое я хотел, и используя эту строку в новом преобразовании BigDecimal ().*

edejong 2014-08-20: Старый URL был мертв, переписан на новый URL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...