1 Reply Latest reply on Feb 17, 2007 9:42 AM by phil92100

    EmbeddId and TableGenerator

    phil92100

      Hello,
      Is there a way to mix EmbeddedId and TableGenerator ??
      Thanks in advance,
      Cheers,
      Philippe

        • 1. Re: EmbeddId and TableGenerator
          phil92100

          Some precisions, here is the code for the Embeddable

          @Embeddable
          public class ContactId implements Serializable {
           @GeneratedValue(strategy = GenerationType.TABLE, generator = "contact_CODE_Gen")
           @TableGenerator(name = "contact_CODE_Gen", table = "SEQUENCE_BLOCK", pkColumnName = "NAME", valueColumnName = "IDX", pkColumnValue = "contact.CODE", initialValue = 1, allocationSize = 1)
           @Column(insertable = true, updatable = true, name = "CODE")
           private java.lang.Integer code;
          
           public ContactId() {
           System.out.println("ContactId - ContactId - constructor : ");
           }
          
           public ContactId(java.lang.Integer code) {
           System.out.println("ContactId - ContactId - constructor : " + code);
           this.code = code;
           }
          
           public java.lang.Integer getCode() {
           System.out.println("ContactId - getCode - code : " + code);
           return code;
           }
          
           public void setCode(java.lang.Integer code) {
           System.out.println("ContactId - setCode - code : " + code);
           this.code = code;
           }
          
           public boolean equals(Object o) {
           return ((o instanceof ContactId) && code.equals(((ContactId) o).getCode()));
           }
          
           public int hashCode() {
           return code.hashCode();
           }
          }
          


          and the entity
          @Entity(name = "ejb30/Contact")
          @EntityListeners( { ContactListener.class })
          @Table(name = "contact")
          public class Contact implements Serializable {
           static final long serialVersionUID = 1171222220859l;
          
           @EmbeddedId
           protected ContactId id;
          
           @Basic(optional = false, fetch = FetchType.EAGER)
           @Column(insertable = true, updatable = true, name = "LIBELLE")
           private java.lang.String libelle;
          
           public Contact() {
           this.id = new ContactId();
           }
          
           public Contact(java.lang.Integer code) {
           this.id = new ContactId(code);
           }
          
           public ContactId getId() {
           return id;
           }
          
           public void setId(ContactId id) {
           this.id = id;
           }
          
           public java.lang.String getLibelle() {
           return libelle;
           }
          
           public void setLibelle(java.lang.String libelle) {
           this.libelle = libelle;
           }
          }
          


          And the JBoss 4.0.5 exception :
          15:32:19,156 WARN [JDBCExceptionReporter] SQL Error: 1048, SQLState: 23000
          15:32:19,156 ERROR [JDBCExceptionReporter] Column 'CODE' cannot be null
          15:32:19,156 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session
          org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
           at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
           at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
           at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:249)
           at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
           at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
           at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
           at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
           at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
           at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
           at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:515)
           at org.jboss.tm.TransactionImpl.doBeforeCompletion(TransactionImpl.java:1491)
           at org.jboss.tm.TransactionImpl.beforePrepare(TransactionImpl.java:1110)
           at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:324)
           at org.jboss.tm.TxManager.commit(TxManager.java:240)
           at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175)
           at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
           at org.jboss.aspects.tx.TxInterceptor$RequiresNew.invoke(TxInterceptor.java:262)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
           at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
           at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
           at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
           at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
           at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
           at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
           at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:263)
           at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
           at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
           at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:828)
           at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:681)
           at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:358)
           at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:398)
           at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239)
          Caused by: java.sql.BatchUpdateException: Column 'CODE' cannot be null
           at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:828)
           at org.jboss.resource.adapter.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:519)
           at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
           at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
           ... 34 more
          


          Thanks for your help.
          Philippe