【问题标题】:Java hibernate save objects in different schemas which are in one databaseJava休眠将对象保存在一个数据库中的不同模式中
【发布时间】:2012-09-25 22:09:18
【问题描述】:

我正在使用 DB2 数据库和休眠框架。有两个表,例如 Word 和 Litter,它们的关系是一对多的。

  1. 架构 A:

    Table Word: ID,
    IDLIT -> references to ID of Litter table
    Name
    
  2. 架构 B:

    Table Litter ID,
    Short_Name,
    Long_Name.
    

两个表都位于两个不同的架构中,但位于一个数据库中。我有一个 POJO 和 XML 映射文件来映射表。现在如何在处理多对一关系(Litter - Word)时将对象保存到数据库中?有什么建议吗?如果是,请提供详细说明,提前谢谢!

更新问题

我也改变了,因为每个 POJO 类的映射 xml 文件都不同。下面是运行代码:

 Session session = HibernateUtility.getSessionFactory().openSession();
   session.beginTransaction();

   Word word = new Word();
   Word word1 =new Word();

   Litter litter = new Litter();
   litter.setFullname("bla bla");
   word.setLitter(litter);    
   word1.setLitter(litter); //Here I have to handle one to many relationship

   Set Words =new  HashSet();
   Words.add(word);
   Words.add(word1);
   litter.setWords(words);
   session.save(litter);
   session.save(word);
   session.save(word1);
  session.getTransaction().commit();
  session.close();

但是这段代码给出了一个异常:JDBCExceptionReporter logExceptions 我使用的方法是否正确?

堆栈跟踪 - - - - - - - - - 信息:架构更新完成 休眠:从 LITTER 中选择 max(ID) 2012 年 2 月 25 日下午 7:33:42 org.hibernate.util.JDBCExceptionReporter logExceptions 警告:SQL 错误:-204,SQLState:42704 2012 年 2 月 25 日下午 7:33:42 org.hibernate.util.JDBCExceptionReporter logExceptions 严重:DB2 SQL 错误:SQLCODE=-204,SQLSTATE=42704,SQLERRMC=BIMASH.LITTER,驱动程序=3.64.104 2012 年 2 月 25 日下午 7:33:42 org.hibernate.util.JDBCExceptionReporter logExceptions 警告:SQL 错误:-204,SQLState:42704 2012 年 2 月 25 日下午 7:33:42 org.hibernate.util.JDBCExceptionReporter logExceptions 严重:DB2 SQL 错误:SQLCODE=-204,SQLSTATE=42704,SQLERRMC=BIMASH.LITTER,驱动程序=3.64.104 2012 年 2 月 25 日下午 7:33:42 org.hibernate.util.JDBCExceptionReporter logExceptions 警告:SQL 错误:-727,SQLState:56098 2012 年 2 月 25 日下午 7:33:42 org.hibernate.util.JDBCExceptionReporter logExceptions 严重:DB2 SQL 错误:SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-204;42704;BIMASH.LITTER, DRIVER=3.64.104 线程“主”org.hibernate.exception.SQLGrammarException 中的异常:无法获取增量生成器的初始值 在 org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67) 在 org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 在 org.hibernate.id.IncrementGenerator.getNext(IncrementGenerator.java:107) 在 org.hibernate.id.IncrementGenerator.generate(IncrementGenerator.java:44) 在 org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99) 在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187) 在 org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33) 在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172) 在 org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27) 在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70) 在 org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535) 在 org.hibernate.impl.SessionImpl.save(SessionImpl.java:523) 在 org.hibernate.impl.SessionImpl.save(SessionImpl.java:519) 在 Main.main(Main.java:73)

【问题讨论】:

  • 能否请您发布堆栈跟踪的相关部分和关联的映射?
  • 如何在问题区域显示 标签?
  • 只使用代码sn-ps中的标签。用 ` 将它们括起来,或者直接选择并单击 code sample。见Markdown help

标签: java hibernate schema database-schema hibernate-mapping


【解决方案1】:

您可以使用映射文件中<class> 元素的schema 属性定义映射类所属的架构。请注意,这将覆盖通用 <hibernate-mapping>schema 属性中的设置。

<!-- A is set to be the default schema -->
<hibernate-mapping schema="A">
    <class name="mypackage.Word" table="WORD" >
    ....
    </class>

    <!-- Overriding the schema definition for this class -->
    <class name="mypackage.Litter" table="LITTER" schema="B">
    ....
    </class>
</hibernate-mapping>

下面的 Hibernate 参考章节可能值得一读:Chapter 5. Basic O/R Mapping,特别是关于 &lt;hibernate-mapping&gt;&lt;class&gt; 元素的部分。

更新

看到堆栈跟踪,似乎在类中使用了&lt;generator class="increment"&gt;。如果是这种情况(select max(ID) from LITTER 查询似乎如此),您还必须在&lt;generator&gt; 中指定架构,以便发出的查询转换为select max(ID) from B.LITTER。您可以在&lt;generator&gt; 中使用名为schema&lt;param&gt; 来实现:

<generator class="increment">
    <param name="schema">B</param>
</generator>

有关更多详细信息,请参阅这个几乎重复的问题:Hibernate: ID generator using increment and Oracle Schema

【讨论】:

  • 我是hibernate的新手,所以我应该创建两个hibernate.cfg.xml吗?我通过逆向工程创建了类,其中我有两个文件 Word.java 和 Word.hbm.xml,并且 Iam 使用 Netbeans。我还应该更改哪些文件?
  • 如果您使用 Hibernate Tools 进行逆向工程,您可以使用 hibernate.reveng.xml 文件中的 &lt;schema-selection&gt; 选项指定要逆向工程的架构。或者,只需在不在默认架构中的实体的&lt;hibernate-mapping&gt;&lt;class&gt; 标记中使用schema 属性。
  • 我很感谢您的努力,我已经更改了 Word 的休眠映射标签的架构,但它给出了一个例外,我已经更新了问题。可以看看吗?
  • 您是否尝试在&lt;class&gt; 元素中添加schema 属性?
  • 是的,我在 '' 元素中加入了 'schema' 属性。这里是另一个异常:SQLGrammarException: could not fetch initial value for increment generator
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 2017-05-09
  • 1970-01-01
  • 2018-01-11
  • 2015-04-27
  • 2013-05-22
相关资源
最近更新 更多