我已经坚持了好几个星期,而且我没有最模糊的想法出了什么问题。我已经很浪费了,因为我已经浪费了很多时间
我使用下面描述的数据模型(MySQL)。我已经通过反向工程(Eclipse / JBoss Tools)创建了hbm.xml和java类(请参见下面的示例)。
当我尝试保存推文,单词或事件时,我可以在日志消息中看到生成了pk值并且正确绑定了参数,但是没有任何内容写入数据库。(请参阅帖子结尾处的日志消息)
但是最奇怪的是,我保存到event_has_words表中的对象已完美存储(带有单词和事件表中生成的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参考手册中:
“数据库事务绝不是可选的,与数据库的所有通信都必须在事务内部进行,无论您是读还是写数据”
我建议您将所有持久性操作都包含在事务中。例如。
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(); }