Hibernate retourne BigIntegers au lieu de aspire
C'est mon Expéditeur entité
@Entity
public class Sender {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long senderId;
...
...
public long getSenderId() {
return senderId;
}
public void setSenderId(long senderId) {
this.senderId = senderId;
}
}
Lorsque j'essaie d'exécuter la requête suivante:
StringBuilder query = new StringBuilder();
query.append("Select sender.* ");
query.append("From sender ");
query.append("INNER JOIN coupledsender_subscriber ");
query.append("ON coupledsender_subscriber.Sender_senderId = sender.SenderId ");
query.append("WHERE coupledsender_subscriber.Subscriber_subscriberId = ? ");
SQLQuery q = (SQLQuery) sessionFactory.getCurrentSession().createSQLQuery(query.toString());
q.setResultTransformer(Transformers.aliasToBean(Sender.class));
q.setLong(0, subscriberId);
return q.list();
L'erreur suivante se passe:
ERREUR: org.mise en veille prolongée.de la propriété.BasicPropertyAccessor - HHH000123: IllegalArgumentException dans la classe:.gimme.la persistance.les entités.De l'expéditeur, la méthode de définition de la propriété: senderId
ERREUR: org.mise en veille prolongée.de la propriété.BasicPropertyAccessor - HHH000091: type: long, de la valeur réelle: java.les mathématiques.BigInteger
Cela se produit parce que le senderId dans la classe de l'Expéditeur est en fait un long au lieu d'un BigInteger (qui est retourné par la mise en veille).
Je me demandais quelle est la meilleure pratique dans un cas comme celui-ci, dois-je utiliser BigIntegers que des id (Semble un peu de trop)?
Devrais-je convertir les résultats de la requête pour les objets de la classe Expéditeur manuellement (ce Qui serait dommage)? Ou puis-je simplement faire Hibernate retour long
id au lieu de BigInteger
s? Ou d'autres idées?
Je suis en utilisant Spring, Hibernate 4.1.1 et MySQL
Oui, ils sont tous de type BIGINT(20). Mais ceux sont des tables générées par Hibernate.
Il y a beaucoup de choses pas clair ici. Votre correspondance doit être à droite de la db, quelle que soit la raison. J'exclure implicite de boxe, unboxing et coulée de questions.
Transformers.aliasToBean
peut carte mal db pour objet de classe si vous avez le mélange des noms.J'ai ajouté mon Expéditeur de l'entité à la question. Mais je ne pense pas que le long de l'id ne doit pas être Mappé BIGINT(20) de MySQL (Quel autre type serait correct dans MySQL?).
vous pouvez changer de type BIGINT(20) de type int? parce que BigInteger ne peut pas être jeté à long implicitement.
OriginalL'auteur Tristan Van Poucke | 2013-09-12
Vous devez vous connecter pour publier un commentaire.
La valeur par défaut pour ".liste()" dans hibernate semble être BigInteger types de retour pour le Numérique. Voici un travail autour de:
en cas de requête hql addScalar n'est pas une fonction de ce que devrait être l'alternative s'il vous plaît laissez-moi savoir
Pas sûr, peut-être, repos, comme une nouvelle question et ajouter le lien ici 🙂
OriginalL'auteur rogerdpack
Objet de la base de données de cartographie est faux. Il y a un casting d'exception en nous disant: champ de base de données est
BigInteger
, mais la propriété de l'objet estlong
.BigInteger
est une classe spéciale de tenir une taille illimitée des valeurs entières. En outre,BigInteger
ne peut pas lancer à long implicitement.Pour éviter cette erreur champ de base de données qui est
BigInteger
doit être changé àlong
type compatible. De le changer pour unint
type int peut être castée pourlong
implicitement. Voir BigInteger.OriginalL'auteur erencan
L'ajout de #Hedley commentaire pour le fixer à l'échelle mondiale, vous pouvez ajouter une ligne dans SQLDialect constructeur.
Dans mon projet, c'était comme:
OriginalL'auteur Алексей Виноградов
Dans les anciennes versions de veille prolongée, vous pouvez utiliser
OriginalL'auteur Willian Crozeta
vous pouvez vérifier sur le lien suivant
consultez ici les BigInteger d'identité générateur de classe
OriginalL'auteur haripcce