JPA Java Double SQL de Numéro de colonne
J'ai le SQL suivant la définition d'un tableau dont je ne peux pas changer
CREATE TABLE network_model_property (
id NUMBER NOT NULL PRIMARY KEY,
name VARCHAR2(100) NOT NULL,
....
max NUMBER(10),
min NUMBER(10),
....
)
La JPA ed définition de classe est le suivant
@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;
}
Je suis à court d'un simple cas de test qui rejette cette exception lorsque la " mise en veille prolongée.hbm2ddl.auto=valider " est défini
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
Et j'ai essayé de
@Column(name = "max", columnDefinition="Decimal(10,2) default '100.00'")
et
@Column(name = "max",precision=10, scale=2)
- Il cartes le max et le min de la propriété de type incorrect.
- Pouvez-vous changer la classe? Si oui, le changement
max
etmin
àLong
ouInteger
. - NON, j'ai besoin de garder la colonne type float/double type.
- Il n'y a aucun point en ayant le Double de votre Entité, alors que votre Tableau ne prend pas en charge la précision qui le Double est d'environ. Comme @John Farrelly suggère, réglez l'échelle à 0.
- Et par la manière, je pense que toutes les propriétés aiment la précision, échelle etc. situé sur @Colonne ne fonctionne pas, parce que vous ne générez pas les tables de la part d'entités, vous avez tout simplement la CARTE à déjà existante de la table. Donc, j'imagine, pour oublier votre conception. Si vous souhaitez utiliser des doubles, travailler avec eux, mais en fin de compte de la carte Entier à une colonne réelle.
Vous devez vous connecter pour publier un commentaire.
Dans votre définition de la table, le max et le min colonnes ont une précision spécifiée, mais pas d'échelle. Essayez à l'aide de l'échelle = 0 sur votre Colonne JPA définition de max & min propriétés.
numeric
pour le champ Numéro de Mobile dans MySQL, et j'ai mis de l'échelle=0, cela a fonctionné parfaitement. Mon Code:@Column(name="MOBILE_NUMBER", precision=0) private double mobileNumber;
. Merci JohnIl a été un temps très long, mais par souci d'exhaustivité, le plus simple correction, la modification de votre JPA Entité définie min et max comme
java.math.BigDecimal
. Lejava.math.BigInteger
etjava.math.BigDecimal
types de fournir la conversion directe de SQLNumeric
etNumber
types de données.Sinon, pour mapper les valeurs correctement, vous devez vous référer à la DB Pilote JDBC de type natif de traduction afin de déterminer ce que jdbc types sont convertis en java.
Oui si vous ne spécifiez pas l'échelle jpa convertit le type numérique.Il est donc toujours préférable de préciser l'ampleur et de la précision pour la même chose.
Donc, chaque fois que vous le modèle des classes d'indiquer l'échelle et la précision whatsever même si l'échelle est de 0 spécifier que c'est 0.
Cheers mate!!
Dans mon cas, la base de données a bien fonctionné avec ma définition, la validation a échoué. Vous pouvez essayer d'utiliser "auto=none".