当前位置: 首页 > 知识库问答 >
问题:

Java hibernate将对象保存在一个数据库中的不同模式中

丁志勇
2023-03-14

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

>

  • 架构A:

    Table Word: ID,
    IDLIT -> references to ID of Litter table
    Name
    
    Table Litter ID,
    Short_Name,
    Long_Name.
    
     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是我正在使用的方法吗?

    Stack trace------------------
    INFO: schema update complete
    Hibernate: select max(ID) from LITTER
    сен 25, 2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
    WARNING: SQL Error: -204, SQLState: 42704
    сен 25, 2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
    SEVERE: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=BIMASH.LITTER, DRIVER=3.64.104
    сен 25, 2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
    WARNING: SQL Error: -204, SQLState: 42704
    сен 25, 2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
    SEVERE: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=BIMASH.LITTER, DRIVER=3.64.104
    сен 25, 2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
    WARNING: SQL Error: -727, SQLState: 56098
    сен 25, 2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
    SEVERE: DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-204;42704;BIMASH.LITTER, DRIVER=3.64.104
    Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not fetch initial value for increment generator
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.id.IncrementGenerator.getNext(IncrementGenerator.java:107)
        at org.hibernate.id.IncrementGenerator.generate(IncrementGenerator.java:44)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
        at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
        at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
        at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
        at Main.main(Main.java:73)
    
  • 共有1个答案

    田柏
    2023-03-14

    可以使用映射文件中 元素的schema属性定义映射类所属的架构。注意,这将覆盖常规 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参考章节可能值得一读:第5章。基本的O/R映射,特别是关于 元素的部分。

    看到堆栈跟踪,类中似乎正在使用 。如果是这样(select max(ID)from litter查询似乎是这样),您还必须在 中指定模式,以便发出的查询转换为select max(ID)from b.litter。您可以在 中使用名为架构来实现此目的:

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

    有关更多详细信息,请参阅这个几乎重复的问题:使用增量和Oracle模式的hibernate:ID生成器

     类似资料:
    • 问题内容: 我有以下问题,当试图在数据库中插入对象时,Hibernate卡住,没有返回错误,对象没有正确保存。 调试它,我发现它挂在 我正在使用PostgreSQL作为数据库。 我的配置文件: SELECT部分​​起作用。 我不确定我缺少什么。同样使用本地SQL插入命令,它也可以工作。 问题答案: 我没看到你这么忙 但最可取的是

    • 问题内容: 我正在使用Hibernate / Spring应用程序来管理一些电影。 班级电影与班级流派有着多对多的关系。这两个类都使用GeneratedValue注释生成了ID。 使用@Cascade(CascadeType.SAVE_UPDATE)通过电影对象保存了流派。我对流派的type属性(它的名称;例如“ Fantasy”)设置了唯一的约束。 我现在想做的是让Hibernate检查是否已经

    • 我有一个实体CandidateTransaction和CandidateTransactionRepository扩展了CrudRepository 我正在使用CrudRepository的save方法来保存所述实体的对象。当实体没有行时,它将创建一个自动生成的键并将其插入ID列,而不需要Java端的干预。 而且,由于CrudRepository的save()方法检查实体是否是新的,如果是新的,它

    • 问题内容: 语境 我正在创建一个数据库环境,在该环境中,我想以几种不同的模式拆分数据以用于不同的用户组。但是,由于其中一个数据库包含公共实体,因此应该共享给所有人。 假设数据库: DB1-通用实体; 车轮实体 DB2-组“ A”; 汽车实体 DB3-组“ B”; 摩托车实体 我有三个不同的项目: 项目1: 车轮豆 专案2: 汽车制造商 专案3: 摩托车构造者 问题 我正在尝试从项目/方案(2,“

    • 问题内容: 这是我的第一篇文章,因此,如果我错过任何内容,请耐心等待:)。 我使用GoJS的go- debug.js库在浏览器上绘制了一些图表,但我在保存选项上遇到了问题。该图产生一个JavaScript对象,您可以通过此命令 myDiagram.model.toJson() 将其转换为Json并将其传递给数据库。我想按保存按钮将使用 Ajax 方法的图表保存到 PhP ,然后保存到 mySQL

    • 我正在创建一个项目,我将让某人从20个类别中最多选择3个类别。因为它总是最多有3个类别,所以在数据库中再创建3列(category\u 1、category\u 2、category\u 3)对我来说并不算多。 我想象在插入的时候,不是保存在3个不同的列中,而是将数组保存到一个“categories”列中。 我的问题是,在获得信息的那一刻。如果我这样做了,比如说搜索每个有一个特定类别的记录,那么什