2009-04-28 2 views
1

Я застрял в этом уже несколько недель, и у меня нет ни малейшего представления о том, что происходит не так. Я довольно отчаянный, поскольку я потратил столько времени ужеHibernate не сохраняет и не бросает исключения?

Я использую модель данных, описанную ниже (MySQL). Я создал классы hbm.xml и java методом обратного проектирования (Eclipse/JBoss Tools) (см. Пример ниже).

Когда я пытаюсь сохранить твиты, слова или события, я вижу в сообщениях журнала, что значения pk генерируются и что параметры связаны правильно, но в базе данных ничего не записывается. (См. Сообщение журнала в самом конце сообщения)

Но самое странное, что объекты, которые я сохраняю в таблице event_has_words, хранятся отлично (сгенерированным идентификатором из слова и таблицы событий)!?! ?! И главное исключение не выбрасывается!?!

Любые идеи? Я схожу с ума!

С наилучшими пожеланиями,

Джон

А вот отображение, не работает:

<?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> 

и по классу:

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; 
} 

    } 

и класс сохраняется

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); 
    }  
    } 
} 

и в журнале я вижу, что идентификаторы генерируются правильно

- generated identifier: component[eventsPkEventsId,wordsPkWordListId,position]{position=128, wordsPkWordListId=128, eventsPkEventsId=56}

+2

Возможно, вам следует разместить сопоставления Hibernate, которые используются, так как проблема может быть там. –

ответ

6

От Hibernate reference manual:

«База данных сделок никогда не по желанию, все коммуникации с базой данных должен произойти внутри транзакции , независимо от того, читаете ли вы или записи «

Я бы рекомендовал вам приложить все ваши постоянные операции в рамках транзакции. Например.

Session session = factory.openSession(); 
Transaction tx; 
try { 
    tx = session.beginTransaction(); 
    session.save(object); 
    tx.commit(); 
} 
catch (Exception e) { 
    if (tx != null) tx.rollback(); 
    throw e; 
} 
finally { 
    session.close(); 
} 
+0

Хорошо, я попробую. Но на данный момент некоторые объекты написаны. –

+0

Да, сделка была проблемой. Кажется, я использовал ложный пример, где транзакция была исключена!?! –

+0

возможно, отправьте пример. мне любопытно. или по крайней мере URL-адрес примера. – Schildmeijer

4

Проверьте регистрацию. Скорее всего, ваш log4j.xml (или его эквивалент) отправляет сообщения журналов где-то, чего вы не ожидаете, или уровень не установлен надлежащим образом, чтобы видеть сообщения из Hibernate. Установите уровень в DEBUG или INFO; это, по крайней мере, позволит вам отлаживать все, что происходит неправильно.

<logger name="org.hibernate"> 
    <level value="DEBUG"/> 
</logger> 
<logger name="org.hibernate.SQL"> 
    <level value="TRACE"/> 
</logger> 

PS: Обеспечивающий источник отличный, но вам нужно сварить его до чего-то кратким. Никто не будет читать все эти детали.

+0

Эй, если вы задумываетесь, почему бы не оставить комментарий о том, почему? Я могу принять конструктивную критику. Я просто предлагаю проверить его инфраструктуру регистрации, так как он говорит, что не видит никаких ошибок. Это действительно такое плохое предложение? –

+1

Я думаю, что downvotes приходят из вашего PS. Ответ не так уж плох, но PS очень плох. Он дает массу подробностей, вы правы. Но я лично предпочитаю слишком много деталей, чтобы этого было недостаточно. ps: Я не спускал вниз, но я думал об этом. – boutta

+0

Я не спустил вас вниз. И спасибо за конкретный подсказку настройки журнала. Я попробую. –

0

Джон, я думаю, вы должны изменить свое целое на длительное время, а также изменить точность и масштаб в своей базе данных (что равно NUMBER).10 и 0 вносите изменения в свои модели bigdecimal или integer в long (все геттер и сеттер) , затем вносите изменения в свои hbm.xml = bigdecimal или целое число в длину, а также в точность и масштаб. , например. hbm.xml

<id name="empid" type="long"> 
      <column name="EMPID" precision="10" scale="0" /> 
      <generator class="increment" /> 
     </id> 

Я также сталкиваюсь с этой проблемой (Oracle 10g), но теперь решено, я надеюсь, что это поможет вам! просто попробуйте один раз

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