2016-09-16 2 views
0

Я использую hibernate для получения некоторых данных из базы данных SQL Server 2014.Неверный тип столбца, связанный с пользовательским типом данных

Существует таблица, которая имеет столбцы определяемых пользователем типов данных:

dbo.Nodos 
    Id (PK, int, not null) 
    Tipo (PK, FK, TipoNodo(tinyint), not null) 
    Nombre (varchar(40), null) 
    PosX (Coordenada(real), not null) 
    PosY (Coordenada(real), not null) 
    Label (varchar(8), not null) 

тех типов данных, которые Coordenada и TipoNodo:

User-Defined Data Types 
    dbo.Coordenada (real, not null) 
    dbo.TipoNodo (tinyint, not null) 

Я отображающую Nodos таблица как класс StopDTO в Java:

@Entity 
@Table(name = "Nodos") 
public class StopDTO { 

    /* 
    * Atributos 
    */ 
    @Id 
    @Column(name = "Id", insertable = false, updatable = false) 
    private Integer id; 
    @Column(name = "Tipo", insertable = false, updatable = false) 
    private Integer tipo; 
    @Column(name = "Nombre", insertable = false, updatable = false) 
    private String nombre; 
    @Column(name = "PosX", insertable = false, updatable = false) 
    private Float posx; 
    @Column(name = "PosY", insertable = false, updatable = false) 
    private Float posy; 
    @Column(name = "Label", insertable = false, updatable = false) 
    private String label; 
    ... 

проблема возникает, когда я запрашиваю StopDTOs (используя NamedNativeQuery), я получаю г следующее сообщение:

Вызванный: org.hibernate.tool.schema.spi.SchemaManagementException: схема-проверка: неправильный тип столбца встречается в колонке [PosX] в таблице [Nodos]; найдено [coordenada (типы # REAL)], но ожидая [всплывают (типы # FLOAT)] на org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateColumnType (SchemaValidatorImpl.java:165) на org.hibernate. tool.schema.internal.SchemaValidatorImpl.validateTable (SchemaValidatorImpl.java:150) на org.hibernate.tool.schema.internal.SchemaValidatorImpl.performValidation (SchemaValidatorImpl.java:95) на org.hibernate.tool.schema. internal.SchemaValidatorImpl.doValidation (SchemaValidatorImpl.java:62) ...

Является ли эта проблема решена путем внедрения пару UserTypes для Coordenada и TipoNodo? Что я могу сделать, если это не так?

Спасибо!

ответ

0

Решенный!

Действительно, это было то, что ожидалось: разработать пару UserType. Я отправлю код в случае, если кому-то нужно:

TipoNodoUserType

package com.mycompany.usertype; 
import java.io.Serializable; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Types; 
import java.util.Objects; 

import org.hibernate.HibernateException; 
import org.hibernate.engine.spi.SessionImplementor; 
import org.hibernate.type.descriptor.java.ShortTypeDescriptor; 
import org.hibernate.usertype.UserType; 

public class TipoNodoUserType implements UserType { 

    public static final TipoNodoUserType INSTANCE = new TipoNodoUserType(); 

    @Override 
    public int[] sqlTypes() { 
     return new int[] {Types.TINYINT}; 
    } 

    @SuppressWarnings("rawtypes") 
    @Override 
    public Class returnedClass() { 
     return Short.class; 
    } 

    @Override 
    public boolean equals(Object x, Object y) throws HibernateException { 
     return Objects.equals(x, y); 
    } 

    @Override 
    public int hashCode(Object x) throws HibernateException { 
     return Objects.hashCode(x); 
    } 

    @Override 
    public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) 
      throws HibernateException, SQLException { 
     String columnName = names[0]; 
     Short columnValue = (Short) rs.getObject(columnName); 
     return columnValue == null ? null : columnValue; 
    } 

    @Override 
    public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) 
      throws HibernateException, SQLException { 
     if(value == null){ 
      st.setNull(index, Types.TINYINT); 
     }else{ 
      String stringValue = ShortTypeDescriptor.INSTANCE.toString((Short)value); 
      st.setString(index, stringValue); 
     } 
    } 

    @Override 
    public Object deepCopy(Object value) throws HibernateException { 
     return value; 
    } 

    @Override 
    public boolean isMutable() { 
     return true; 
    } 

    @Override 
    public Serializable disassemble(Object value) throws HibernateException { 
     return (Serializable) value; 
    } 

    @Override 
    public Object assemble(Serializable cached, Object owner) throws HibernateException { 
     return cached; 
    } 

    @Override 
    public Object replace(Object original, Object target, Object owner) throws HibernateException { 
     return original; 
    } 

} 

CoordenadaUserType

package com.mycompany.usertype; 
import java.io.Serializable; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Types; 
import java.util.Objects; 

import org.hibernate.HibernateException; 
import org.hibernate.engine.spi.SessionImplementor; 
import org.hibernate.type.descriptor.java.FloatTypeDescriptor; 
import org.hibernate.usertype.UserType; 

public class CoordenadaUserType implements UserType { 

    public static final CoordenadaUserType INSTANCE = new CoordenadaUserType(); 

    @Override 
    public int[] sqlTypes() { 
     return new int[] {Types.REAL}; 
    } 

    @SuppressWarnings("rawtypes") 
    @Override 
    public Class returnedClass() { 
     return Float.class; 
    } 

    @Override 
    public boolean equals(Object x, Object y) throws HibernateException { 
     return Objects.equals(x, y); 
    } 

    @Override 
    public int hashCode(Object x) throws HibernateException { 
     return Objects.hashCode(x); 
    } 

    @Override 
    public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) 
      throws HibernateException, SQLException { 
     String columnName = names[0]; 
     Float columnValue = (Float) rs.getObject(columnName); 
     return columnValue == null ? null : columnValue; 
    } 

    @Override 
    public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) 
      throws HibernateException, SQLException { 
     if(value == null){ 
      st.setNull(index, Types.REAL); 
     }else{ 
      String stringValue = FloatTypeDescriptor.INSTANCE.toString((Float)value); 
      st.setString(index, stringValue); 
     } 
    } 

    @Override 
    public Object deepCopy(Object value) throws HibernateException { 
     return value; 
    } 

    @Override 
    public boolean isMutable() { 
     return true; 
    } 

    @Override 
    public Serializable disassemble(Object value) throws HibernateException { 
     return (Serializable) value; 
    } 

    @Override 
    public Object assemble(Serializable cached, Object owner) throws HibernateException { 
     return cached; 
    } 

    @Override 
    public Object replace(Object original, Object target, Object owner) throws HibernateException { 
     return original; 
    } 

} 

StopDTO

@Entity 
@Table(name = "Nodos") 
public class StopDTO implements java.io.Serializable{ 

    /* 
    * Atributos 
    */ 
    private static final long serialVersionUID = 8171715812406080593L; 

    @Id 
    @Column(name = "Id", insertable = false, updatable = false) 
    private Integer id; 
    @Id 
    @Column(name = "Tipo", insertable = false, updatable = false) 
    @Type(type = "com.mycompany.usertype.TipoNodoUserType") 
    private Short tipo; 
    @Column(name = "Nombre", insertable = false, updatable = false) 
    private String nombre; 
    @Column(name = "PosX", insertable = false, updatable = false) 
    @Type(type = "com.mycompany.usertype.CoordenadaUserType") 
    private Float posx; 
    @Column(name = "PosY", insertable = false, updatable = false) 
    @Type(type = "com.mycompany.usertype.CoordenadaUserType") 
    private Float posy; 
    @Column(name = "Label", insertable = false, updatable = false) 
    private String label; 
    ... 
    // Don't forget to code an empty constructor, setters/getters for every attribute and implementing hashCode and equals methods (as we're implementing Serializable interface). 
1

Проверьте диалект, настроенный в Hibernate, это должен быть SQLServer2008Dialect.

+0

У меня есть : configuration.setProperty (AvailableSettings.DIALECT, "org.hibernate.dialect.SQLServer2012Dialect"); – russellhoff

Смежные вопросы