Hibernate + PostgreSQL (on MyEclipse + Spring): sequence
От: sir_shaman  
Дата: 19.03.06 11:53
Оценка:
только изучаю эту связку, поэтому могу наговорить ляпов — заранее прошу отнестись с пониманием.

по англоязычной сети ходит слушок, что как ни вертись, динамически создать таблицу (то есть если нету) в базе на основе дескриптора hibernate-мэппинга (smth.hbm.xml) для PostgreSQL не получится.

я разбираюсь с вот этим великолепным туториалом, но поскольку тут про все понемногу — я на предыдущей главе про JDBC, но уже с наличием hibernate-дескрипторов . чаще всего занимаюсь конечно копи/пэйстом, но обнаруживаю за собой, что все-таки осознаю, что делаю — так что в идеале все должно работать . и конечно там ни слова о Postgres.

проблема в том, что таблица при отустствии создается, но sequence пристроить никак не получается. простейщая фича типа

        <id name="bookID" type="java.lang.Long">
            <meta attribute="default-value">nextval('book_id_seq'::regclass)</meta>
            <column name="id" />
            <generator class="sequence" >
                <param name="sequence">book_id_seq</param>
            </generator>
        </id>


не прокатывает — сам sequence в базе создается, но при попытке insert (поле, поле, поле) пишет, что пытаюсь впихнуть null в непозволительное для этого поле айдишника.

имеет ли вообще смысл с этим париться — может забить и просто создавать таблицу ручками (что, конечно, не красиво, но для моего проекта прокатит)?

на всякий случай, applicationContext:

    <bean id="hibernateDataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName">
            <value>org.postgresql.Driver</value>
        </property>
        <property name="url">
            <value>jdbc:postgresql://localhost:5432/***</value>
        </property>
        <property name="username">
            <value>****</value>
        </property>
        <property name="password">
            <value>****</value>
        </property>
    </bean> 

    <bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.connection.pool_size">5</prop>
                <prop key="hibernate.connection.autocommit">true</prop>
                <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
                <prop key="hibernate.cglib.use_reflection_optimizer">false</prop>
              </props>
        </property>    
        <property name="dataSource">
            <ref local="hibernateDataSource" />
        </property>
          <property name="mappingResources">
            <list>
                  <value>***/springtest/hibernate/Book.hbm.xml</value>
                  .....             
            </list>
        </property>        
    </bean>
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource">
              <ref local="hibernateDataSource"/>
        </property>
    </bean>  
    
      <bean id="bookManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager">
             <ref local="transactionManager"/>
        </property>
        <property name="target">
             <bean class="***.springtest.bl.BookManager">
                 <property name="dataSource">
                      <ref local="hibernateDataSource"/>
                 </property>
             </bean>
        </property>
        <property name="transactionAttributes">
             <props>
                 <prop key="*">PROPAGATION_REQUIRED</prop>
             </props>
        </property>
    </bean>
Re: Hibernate + PostgreSQL (on MyEclipse + Spring): sequence
От: sir_shaman  
Дата: 19.03.06 13:18
Оценка:
почитал правила составления вопросов, понял что выразил вопрос несколько туманно, поэтому хочу уточнить некоторые вещи:

0) сам вопрос: "я делал все что мог и следовал даже не одному туториалу, а нескольким: что нужно сделать с моим дескриптором, чтобы сгенерировать рабочую таблицу с sequence'ом". конкретнее — пп. б. и в . естественно, я мог где-то ошибиться — в чем и вопрос .
он не требует помощи, а просто просит отозваться, если есть возможность.
а) google в инфе по запросу "hibernate postgreSQL sequence" либо говорит, что если я сделаю так как сделал (см. выше book.hbm.xml, описание колонки id) — все будет прекрасно, либо молчит в тряпочку. инфы по связке не особо много.
б) по этому дескриптору создается следующая таблица (все выполняющиеся sql-команды отвечают только за select/insert/update):
create table "public"."book"(
"id" int8 PRIMARY KEY not null,
"title" varchar(255) not null,
"author" varchar(255) not null,
"borrowed" bool not null)

в) а хотелось бы — вот такую:
create table "public"."book"(
"id" serial PRIMARY KEY default 'nextval('book_iq_seq'::regclass)' not null,
"title" varchar(255) not null,
"author" varchar(255) not null,
"borrowed" bool not null)


пункт о трате времени на большой пост еще вначале постарался исправить сабжем.
Re: Hibernate + PostgreSQL (on MyEclipse + Spring): sequence
От: sir_shaman  
Дата: 19.03.06 14:06
Оценка:
спасибо, ребята. вопрос решился, когда наткнулся на вот этот тред на javable.com.

для тех, у кого возникли схожие проблемы, привожу нужный дескриптор:

<hibernate-mapping package="****.springtest">
    <class name="****.springtest.Book" table="book" schema="public">
        <!-- 
            create table "public"."book"(
            "id" bigserial PRIMARY KEY default 'nextval('book_id_seq1'::regclass)' not null,
            "title" varchar(255) not null,
            "author" varchar(255) not null,
            "borrowed" bool not null)
        -->
        <id name="bookID" column="id" type="java.lang.Long">
         <generator class="identity">
          <param name="sequence">book_id_seq</param>
            </generator>
    </id>            
        <property name="bookTitle" type="java.lang.String">
            <meta attribute="default-value">Undefined</meta>        
            <column name="title" not-null="true" unique="true" />
        </property>
        <property name="bookAuthor" type="java.lang.String">
            <meta attribute="default-value">Undefined</meta>        
            <column name="author" not-null="true" />
        </property>        
        <property name="isBorrowed" type="java.lang.Boolean">
            <meta attribute="default-value">false</meta>        
            <column name="borrowed" not-null="true" />
        </property>                
  </class>
</hibernate-mapping>


все работает на ура: таблица и sequence создаются сами и великолепно работают.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.