Hibernate不保存并且不会抛出异常?

时间:2009-04-28 21:26:20

标签: database hibernate java-ee

我已经坚持了几个星期了,我不知道出了什么问题。因为我已经浪费了这么多时间,所以我非常绝望

我使用下面描述的数据模型(MySQL)。我通过reverse engeneering(Eclipse / JBoss Tools)创建了hbm.xml和java类(参见下面的示例)。

当我尝试保存推文,单词或事件时,我可以在日志消息中看到生成pk值并且参数绑定正确,但是没有任何内容写入数据库。 (请参阅帖子最后的日志消息)

但最奇怪的是我保存到event_has_words表的对象是完美存储的(使用word和事件表中生成的id)!?!?!最重要的是没有异常被抛出!?!

有什么想法吗?我疯了!

致以最诚挚的问候,

约翰

这是一个不起作用的映射:

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

在日志中我可以看到id正确生成

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

3 个答案:

答案 0 :(得分:8)

来自Hibernate reference manual

  

“数据库事务永远不会   可选的,与a的所有通信   数据库必须在一个内部发生   交易,无论你是否阅读或   写数据“

我建议您将所有持久性操作包含在事务中。 例如

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

答案 1 :(得分:4)

检查您的日志记录。很可能您的log4j.xml(或等效的)正在您不期望的地方发送日志消息,或者未正确设置级别以查看来自Hibernate的消息。将级别设置为 DEBUG INFO ;这至少可以让你能够调试出错的地方。

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

PS:提供来源很棒,但你需要把它归结为简洁的东西。没有人会阅读所有这些细节。

答案 2 :(得分:0)

John,我认为您应该将整数更改为long,以及更改数据库中的精度和比例(即NUMBER)eq。 10和0 在模型中更改bigdecimal或整数到long(所有getter和setter) 然后在hbm.xml = bigdecimal或整数中进行更改,以及精度和比例。 例如hbm.xml

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

我也遇到了这个问题(oracle 10g),但现在已经解决了,我希望它可以帮到你!只试一次