Hibernate не сохраняет и не создает исключений? - PullRequest
1 голос
/ 29 апреля 2009

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

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

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

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

Есть идеи? Я схожу с ума!

С уважением,

John

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

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

Ответы [ 3 ]

8 голосов
/ 05 мая 2009

Из справочника Hibernate :

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

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

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();
}
4 голосов
/ 05 мая 2009

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

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

PS: предоставление источника - это здорово, но вам нужно свести его к чему-то лаконичному. Никто не собирается читать все эти детали.

0 голосов
/ 10 апреля 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...