2016-02-15 25 views
0

我有一個Postgres數據庫如下表:休眠:如何進行逆向工程並使用Postgres串行類型列?

CREATE TABLE net.polygon 
(
    id serial NOT NULL, 
    x numeric, 
    y numeric, 
    CONSTRAINT pk_polygon PRIMARY KEY (id) 
); 

自動serial類型創建一個用來創建一個新的主鍵每一個新行插入此表時的順序:

CREATE SEQUENCE net.polygon_id_seq 
    INCREMENT 1 
    MINVALUE 1 
    MAXVALUE 9223372036854775807 
    START 1 
    CACHE 1; 

我需要從Java程序向這個表中插入數據。我使用Hibernate來反向工程這個數據庫;該reveng.xml文件看起來像:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" > 

<hibernate-reverse-engineering> 
    [...] 
    <table-filter match-name="polygon"></table-filter> 

    <table name="polygon"> 
     <primary-key> 
      <generator class="sequence"> 
       <param name="sequence">polygon_id_seq</param> 
      </generator> 
     </primary-key> 
    </table> 

</hibernate-reverse-engineering> 

這會產生相應的POJO,爲polygon表下面的映射:

polygon = new Polygon(); 
polygon.setX(someValue); 
polygon.setY(anotherValue); 
session.save(polygon); 

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<!-- Generated Feb 15, 2016 9:54:40 AM by Hibernate Tools 4.3.1.Final --> 
<hibernate-mapping> 
    <class name="Polygon" table="polygon" optimistic-lock="version"> 
     <id name="id" type="java.lang.Integer"> 
      <column name="id" /> 
      <generator class="sequence"> 
       <param name="sequence">polygon_id_seq</param> 
      </generator> 
     </id> 
     <property name="x" type="big_decimal"> 
      <column name="x" precision="131089" scale="0" /> 
     </property> 
     <property name="y" type="big_decimal"> 
      <column name="y" precision="131089" scale="0" /> 
     </property> 
    </class> 
</hibernate-mapping> 

在Java代碼中,就像創建新Polygon對象

但它產生以下異常:

ERROR: relation "net.hibernate_sequence" does not exist

我查到了密碼,找不到任何關於這個hibernate_sequence的引用。如果它是一個序列,爲什麼Hibernate試圖使用它而不是reveng.xml文件中提供的那個?

更新:Hibernate IRC的人告訴我這是Hibernate Tools的一個問題,即is not yet up to date with the latest Hibernate release

+0

這很奇怪。你有沒有嘗試清理建立你的項目? –

+0

是的,但錯誤依然存在。 –

回答

0

雖然不解決休眠的工具的問題,序列可以使用這種映射在.reveng.xml文件中的Eclipse火星使用:

<table name="entity"> 
    <primary-key> 
     <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator"> 
      <param name="optimizer">none</param> 
      <param name="increment_size">1</param> 
      <param name="sequence_name">entity_id_seq</param> 
     </generator> 
    </primary-key> 
</table> 

primary-block將獲得在hbm.xml文件自動插入:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<!-- Generated Feb 23, 2016 2:14:25 PM by Hibernate Tools 4.3.1.Final --> 
<hibernate-mapping> 
    <class name="Entity" table="entity" optimistic-lock="version"> 
     <id name="idEntity" type="java.lang.Integer"> 
      <column name="id_entity" /> 
      <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator"> 
       <param name="optimizer">none</param> 
       <param name="sequence_name">entity_id_seq</param> 
       <param name="increment_size">1</param> 
      </generator> 
     </id> 
     [...] 
    </class> 
</hibernate-mapping> 

並且將使用正確的序列(在這種情況下爲entity_id_seq)。雖然它需要識別和手動設置每個序列,但該解決方案不需要更改生成的類和配置文件,因此它是一次性任務。

相關問題