Hibernate n'enregistre pas et ne lance pas des exceptions?
Je suis coincé avec ce déjà depuis quelques semaines et je n'ai pas la moindre idée de ce qui va mal. Je suis assez désespérée car j'ai perdu beaucoup de temps déjà
- Je utiliser le modèle de données décrit ci-dessous (MySQL). J'ai créé le hbm.xml et des classes java par reverse engeneering (Eclipse/JBoss Tools) (voir l'exemple ci-dessous).
Lorsque j'essaie d'enregistrer des tweets, des mots ou des événements que je peux voir dans le journal des messages que les valeurs de clé primaire sont générés, et que les paramètres sont tenus correctement, mais rien n'est jamais écrit à la base de données. (Voir le message du journal à la fin du post)
Mais la chose la plus étrange est que les objets que j'ai enregistrer pour le event_has_words table sont stockées parfaitement (avec l'id généré à partir de la parole et de la table des événements)!?!?! Et avant tout sans exception est lancée!?!
Des idées? Je suis fou!
Cordialement,
Jean
Et voici une cartographie qui ne fonctionne pas:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="de.brotkasting.buki.cep.data.hibernate.entities.Event" table="event" catalog="cep1">
<id name="pkEventsId" type="java.lang.Integer">
<column name="PK_Events_Id" />
<generator class="identity" />
</id>
<many-to-one name="sourceSystems" class="de.brotkasting.buki.cep.data.hibernate.entities.SourceSystems" fetch="select">
<column name="SourceSystems_PK_SourceSystems_Id" not-null="true" />
</many-to-one>
<many-to-one name="tweets" class="de.brotkasting.buki.cep.data.hibernate.entities.Tweets" fetch="select">
<column name="Tweets_pk_tweet_id" not-null="true" />
</many-to-one>
<property name="systemTimeStamp" type="timestamp">
<column name="System_Time_Stamp" length="19" not-null="true" />
</property>
</class>
</hibernate-mapping>
et la fonction de la classe:
package de.brotkasting.buki.cep.data.hibernate.entities;
//Generated 28.04.2009 21:24:54 by Hibernate Tools 3.2.4.GA
@Entity
@Table(name = "event", catalog = "cep1")
public class Event implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 3530010885697280401L;
private Integer pkEventsId;
private SourceSystems sourceSystems;
private Tweets tweets;
private Date systemTimeStamp;
public Event() {
}
public Event(SourceSystems sourceSystems, Tweets tweets,
Date systemTimeStamp) {
this.sourceSystems = sourceSystems;
this.tweets = tweets;
this.systemTimeStamp = systemTimeStamp;
}
@Id
@Column(name = "PK_Events_Id", unique = true, nullable = false)
public Integer getPkEventsId() {
return this.pkEventsId;
}
public void setPkEventsId(Integer pkEventsId) {
this.pkEventsId = pkEventsId;
}
@JoinColumn(name = "SourceSystems_PK_SourceSystems_Id", nullable = false)
public SourceSystems getSourceSystems() {
return this.sourceSystems;
}
public void setSourceSystems(SourceSystems sourceSystems) {
this.sourceSystems = sourceSystems;
}
@JoinColumn(name = "Tweets_pk_tweet_id", nullable = false)
public Tweets getTweets() {
return this.tweets;
}
public void setTweets(Tweets tweets) {
this.tweets = tweets;
}
//@Temporal(TemporalType.TIMESTAMP)
@Column(name = "System_Time_Stamp", nullable = false, length = 19)
public Date getSystemTimeStamp() {
return this.systemTimeStamp;
}
public void setSystemTimeStamp(Date systemTimeStamp) {
this.systemTimeStamp = systemTimeStamp;
}
}
et la classe de persiste
public class TweetPersistence extends HibernateBase {
private static int batchCounter = 0;
private static void store(Object object) throws HibernateException
{
try {
if(session == null)
{
session = sessionFactory.openSession();
}
if(!session.isOpen())
{
session = sessionFactory.openSession();
}
session.save(object);
LoggingConfigurator.getInstance().info("Objekt:" +object);
//flush cache every 20 saved entities
//if(batchCounter%20 == 0)
//{
session.flush();
session.clear();
//}
//increment batchCounter
batchCounter++;
} catch (HibernateException e) {
e.printStackTrace(System.out);
}
}
public static void storeTweet(Tweets tweet) {
try {
if (tweet != null) {
store(tweet);
}
} catch (HibernateException e) {
e.printStackTrace(System.out);
}
}
}
et dans le journal, je peux voir que les id sont générés correctement
- generated identifier: component[eventsPkEventsId,wordsPkWordListId,position]{position=128, wordsPkWordListId=128, eventsPkEventsId=56}
- Peut-être que vous devriez poster Hibernate mapping sont utilisés, puisque le problème est peut être là.
Vous devez vous connecter pour publier un commentaire.
De la Hibernate manuel de référence:
Je vous recommande de joindre tous vos persistant des opérations au sein d'une transaction.
Par exemple.
Vérifier votre enregistrement. Très probablement, vos
log4j.xml
(ou l'équivalent) est l'envoi de messages de log quelque part qu'on n'attendait pas, ou le niveau n'est pas définis de façon à voir les messages de mise en veille prolongée. Définir le niveau de DEBUG ou INFO; cela permettra au moins de vous permettre d'être en mesure de déboguer tout ce qui ne va pas.PS: la fourniture du code source est grande, mais vous avez besoin de la faire bouillir pour quelque chose de concis. Personne ne va le lire au travers de tous ces détails.
John, je pense que vous devriez changer votre entier à longue ainsi que de modifier la précision et l'échelle de votre base de données (qui est le NUMÉRO) eq. 10 et 0
faire des changements dans vos modèles bigdecimal ou entier long(tous les getter et setter)
puis faire des changements dans votre
hbm.xml = bigdecimal
ou entier long ainsi que la précision et l'échelle.par exemple hbm.xml
J'ai aussi été confronté à ce problème (oracle 10g) mais maintenant résolu, j'espère que cela vous aide! essayez juste une fois