【问题标题】:Hibernate doesn't save and doesn't throw exceptions?Hibernate 不保存也不抛出异常?
【发布时间】:2009-04-28 21:26:19
【问题描述】:

我已经被这个问题困扰了好几个星期了,我一点也不知道出了什么问题。我很绝望,因为我已经浪费了这么多时间了

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

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

但最奇怪的是,我保存到 event_has_words 表中的对象被完美存储(使用从 word 和 event 表生成的 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}

【问题讨论】:

  • 也许您应该发布所使用的 Hibernate 映射,因为问题可能存在。

标签: database hibernate jakarta-ee


【解决方案1】:

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

【讨论】:

  • 好的,我试试。但目前无论如何都写了一些对象。
  • 是的,事务就是问题所在。看来我用了一个错误的例子,交易被遗漏了!?!
  • 可能,发布示例。我很好奇。或至少是示例的网址。
【解决方案2】:

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

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

PS:提供源代码很好,但您需要将其归结为简明扼要的内容。没有人会阅读所有这些细节。

【讨论】:

  • 嘿,如果你投反对票,为什么不评论为什么?我可以接受建设性的批评。我只是建议他检查他的日志基础设施,因为他说他没有看到任何错误。这真的是一个糟糕的建议吗?
  • 我认为反对票来自您的 PS。答案不是那么糟糕,但PS非常糟糕。他提供了大量的细节,你是对的。但我个人更喜欢细节太多而不是不够。 ps:我没有投反对票,但我考虑了一下。
  • 我没有对你投反对票。并感谢特定的日志设置提示。我会试试的。
【解决方案3】:

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

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

我也遇到过这个问题(oracle 10g),但现在解决了,希望对您有所帮助!试一次

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 2016-04-03
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多