2014-12-18 2 views
0

Я настроил «вопросительный знак» отношения «многие ко многим». В спящем режиме Когда я тестирую его с помощью небольшой программы он имеет ошибку follwing: (My Hibernate версия 3.1)Я получаю сообщение об ошибке «Не удалось выполнить пакетное обновление JDBC» при использовании спящего режима «Многие для многих»

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). 
log4j:WARN Please initialize the log4j system properly. 
Hibernate: insert into javaqa2.qa_tag (creator_id, name, description, create_date, used_cnt) values (?, ?, ?, ?, ?) 
Hibernate: insert into javaqa2.qa_tag (creator_id, name, description, create_date, used_cnt) values (?, ?, ?, ?, ?) 
Hibernate: insert into javaqa2.qa_question (creator_id, subject, content, creator_ip, question_tags, upvote_cnt, downvote_cnt, visit_cnt, answer_cnt, comment_cnt, istopmost, islocked, isanonym, create_date) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
Hibernate: insert into qa_question_tags (question_id, tag_id) values (?, ?) 
Hibernate: insert into qa_question_tags (question_id, tag_id) values (?, ?) 
Exception in thread "main" org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103) 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:143) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) 
    at test.Test1.main(Test1.java:49) 
Caused by: java.sql.BatchUpdateException: No database selected 
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1669) 
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1085) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195) 
    ... 8 more 

Это моя программа испытаний: общественного класса Test1 {

public static void main(String[] args) { 
    Configuration cfg=new Configuration().configure(); 
    SessionFactory sf=cfg.buildSessionFactory(); 
    Session session = sf.openSession(); 
    Transaction trans = session.beginTransaction(); 

    Student student = (Student)session.load(Student.class, Integer.valueOf(45)); 
    Question question=new Question(student, "test8881","test8882", 
      "192.168,88.88","Java,dotNet,Struts2", 0,0,0,0,0, 
      Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, 
      new Date()); 
    Tag tag1=new Tag(student,"test tag1","test tag1",new Date(),0); 
    Tag tag2=new Tag(student,"test tag2","test tag2",new Date(),0); 

    session.save(tag1); 
    session.save(tag2); 

    Set<Tag> tagList =new HashSet<Tag>(); 
    tagList.add(tag1); 
    tagList.add(tag2); 

    question.setTags(tagList); // when add this line... error occurs 

    session.save(question); 
    trans.commit(); 
} 

Эта программа хорошо работает, когда метод setTags (tagLis t) не вызвано для вопроса, однако, когда я добавляю этот вызов метода, возникает ошибка. (см. комментарий в программе).

Это часть свойств Question.hbm.xml, определенных многими-ко-многим.

<set name="tags" table="qa_question_tags" lazy="true" cascade="all"> 
     <key column="question_id"/> 
     <many-to-many class="model.Tag" column="tag_id"/> 
    </set> 

Я установил следующее свойство в моем hibernate.cfg.xml обеспечить таблица будет обновляться автоматически.

<property name="hbm2ddl.auto"> update </property> 

Я был в замешательстве с сообщением об ошибке и, пожалуйста, сообщите мне, где это неправильно?

+0

ошибка, кажется, из-за некоторой конфигурации mysql jdbc, но поскольку она работает в одном сценарии, можете ли вы обновить сообщение с помощью запросов на спящий режим, которые выполняются, когда question.setTags (tagList) НЕ вызывается? –

+0

Hibernate: insert into javaqa2.qa_question (creator_id, subject, content, creator_ip, question_tags, upvote_cnt, downvote_cnt, visit_cnt, answer_cnt, comment_cnt, istopmost, islocked, isanonym, create_date) значения (?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?) Спящий режим: вставить в javaqa2.qa_tag (creator_id, имя, описание, create_date, used_cnt) значения (?,?,?,?,?) Hibernate : insert в javaqa2.qa_tag (creator_id, name, description, create_date, used_cnt) значения (?,?,?,?,?) Hibernate: insert into qa_question_tags (question_id, tag_id) значения (?,?) – mikemelon

+0

@ Andy Dufresne , Я тоже подозревал конфигурацию jdbc. Однако запрос, когда setTag (tagList) не вызывается, выше и кажется нормальным. Извините, комментарий не отформатирован хорошо. – mikemelon

ответ

0

Я нашел точку в своих спящих запросах, спасибо за терпение и тщательность @ Энди Defresne.

В журнале ниже:

Hibernate: insert into javaqa2.qa_tag (creator_id, name, description, create_date, used_cnt) values (?, ?, ?, ?, ?) 
Hibernate: insert into javaqa2.qa_tag (creator_id, name, description, create_date, used_cnt) values (?, ?, ?, ?, ?) 
Hibernate: insert into javaqa2.qa_question (creator_id, subject, content, creator_ip, question_tags, upvote_cnt, downvote_cnt, visit_cnt, answer_cnt, comment_cnt, istopmost, islocked, isanonym, create_date) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
Hibernate: insert into qa_question_tags (question_id, tag_id) values (?, ?) 
Hibernate: insert into qa_question_tags (question_id, tag_id) values (?, ?) 

Последние две строки "вставить в qa_question_tags" отсутствуют в "javaqa." каталог.

Так добавить следующее свойство каталог = «javaqa2» в Question.hbm.xml:

<set name="tags" table="qa_question_tags" lazy="true" cascade="all" catalog="javaqa2"> 
     <key column="question_id"/> 
     <many-to-many class="model.Tag" column="tag_id"/> 
</set> 

Тогда проблема решена, и ошибка исчезает.

Чтобы быть полными, я после моего Question.hbm.xml, и нашел свойство каталога, установленное в <class> теге не достаточно, он должен быть установлен в <set> теге снова:

<hibernate-mapping> 
    <class name="model.Question" table="qa_question" catalog="javaqa2"> 
     ... 
     <set name="tags" table="qa_question_tags" lazy="true" cascade="all" catalog="javaqa2"> 
     <key column="question_id"/> 
     <many-to-many class="model.Tag" column="tag_id"/> 
     </set> 
    </class> 
</hibernate-mapping> 
+0

Отлично. Приятно видеть, что тайна разрешена ;-) –

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