Hibernate e a geração do código de domínio com Oracle com triggers de auto-incremento

10 respostas
J

Utilizei o MySql e deu tudo certo, porém quando crio POJOs a partir de uma base de dados Oracle, pela geração automática de código utilizando Netbeans 6.5, o construtor releva as chaves primárias, entretanto existem triggers de auto-incremento, as quais me incumbi de criar. Pela geração automática, deveria existir comentário EJB3 de semelhante forma que aconteceu quando utilizo o MySql, dessa maneira:

@Id @GeneratedValue(strategy=IDENTITY)

@Column(name="id", unique=true, nullable=false)
public Long getId() {
    return this.id;
}

public void setId(Long id) {
    this.id = id;
}

Quando utilizo Oracle, segue:

@Id

@Column(name=“id”, unique=true, nullable=false, precision=22, scale=0)

public BigDecimal getId() {

return <a href="http://this.id">this.id</a>;

}
public void setId(BigDecimal id) {
    this.id = id;
}

Abro a página web preencho o formulário, não acusa erro algum, porém não insere informação alguma quando visualizo as tabelas no Oracle!

Não encontro nenhum caso semelhante, o Google tem sofrido :D, se alguém puder ajudar, agradeço desde já!

Obrigado pela atenção.

10 Respostas

P

hibernate também sofre
assim funciona

@Id

@GeneratedValue

@Column(name=id)

private Long id;

BigDecimal geralmente é para valores em moeda.

J

Já pesquisei bastante, implantei código GeneratedValue e SequenceGenerated,
de todas as formas, modifiquei o construtor, ocasionando inclusive um erro porque o código automático
não pode ser modificado, então o que me leva aq crer que não há nada a fazer no netbeans porque o código é gerado,
e ocorre esse desastre com o oracle. Como a minha empresa trabalha com o Oracle, o Eclipse pode ser uma solução???

P

Eu sempre usei eclipse.
A gente faz algumas coisas no braço, mas no final dá tudo certo.

J

Existem casos bem-sucedidos de Netbeans e Hibernate + Oracle,
se alguém puder ajudar, fico grato!

J

java.lang.annotation.IncompleteAnnotationException: org.hibernate.annotations.Parameter missing element value

@Id
@GenericGenerator(name=“banco_id_seq”,
strategy=“jpl.hibernate.util.TriggerAssignedIdentityGenerator”,parameters=@Parameter(name=“idbanco”,value=“1”))

tá dando esse erro agora!

J

@Id
@GenericGenerator(name = “banco_id_seq”, strategy = “jpl.hibernate.util.TriggerAssignedIdentityGenerator”,parameters={@Parameter(name=“max_lo”, value=“100”)})
@GeneratedValue(strategy=GenerationType.SEQUENCE)

mesmo que eu coloque apenas o GeneratedValue como AUTO, ainda gera este erro:

org.hibernate.exception.SQLGrammarException: could not get next sequence value

Será que o problema está na criação da sequence ou trigger?

Vai o código de criação aí:

create sequence “banco_id_seq”;

CREATE OR REPLACE TRIGGER  "bi_banco"

before insert on banco

for each row

begin

select “banco_id_seq”.nextval into :NEW.idbanco from dual;

end;

ALTER TRIGGER “bi_banco” ENABLE;

ajudem-me brothers valeu!

J

Esta é a maneira correta:

@Id @GeneratedValue(generator=“banco_id_seq”,strategy=GenerationType.SEQUENCE)
@SequenceGenerator(name=“banco_id_seq”, sequenceName=“banco_id_seq”)

@Column(name="IDBANCO", unique=true, nullable=false, precision=22, scale=0)
public BigDecimal getIdbanco() {
    return this.idbanco;
}

public void setIdbanco(BigDecimal idbanco) {
    this.idbanco = idbanco;
}

porém dá erro:

SQL Error: 2289, SQLState: 42000

ORA-02289: a seqüência não existe

The log message is null.

org.hibernate.exception.SQLGrammarException: could not get next sequence value

at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)

at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)

at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:96)

at org.hibernate.id.SequenceHiLoGenerator.generate(SequenceHiLoGenerator.java:58)

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 CadastroEstagiario.ceActionForm.validate(ceActionForm.java:229)

at org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:950)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:207)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)

at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)

at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:290)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)

at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272)

at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)

at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)

at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)

at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)

at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)

at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)

at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)

at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)

Caused by: java.sql.SQLException: ORA-02289: a seqüência não existe

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)

at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)

at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)

at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:799)

at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1038)

at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:839)

at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1133)

at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)

at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329)

at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:75)
J

EURECA

J

ae galera show de bola deu certo, e já que tem muitos acessos resolvi postar a solução!
este é o meu arquivo hibernate.cfg:

<?xml version=1.0 encoding=UTF-8?>

<!DOCTYPE hibernate-configuration PUBLIC -//Hibernate/Hibernate Configuration DTD 3.0//EN” “<a href="http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd</a>”>

<hibernate-configuration>

<session-factory>

<property name=hibernate.dialect>org.hibernate.dialect.OracleDialect</property>

<property name=hibernate.connection.driver_class>oracle.jdbc.OracleDriver</property>

<property name=hibernate.connection.url>jdbc:oracle:thin:@127.0.0.1:1521:xe</property>

<property name=hibernate.connection.username>sgrhe</property>

<property name=hibernate.connection.password>secreto11</property>

<property name=hibernate.connection.pool_size>1</property>

<property name=hibernate.current_session_context_class>thread</property>

<property name=hibernate.cache.provider_class>org.hibernate.cache.NoCacheProvider</property>

<property name=hibernate.show_sql>true</property>

<property name=hibernate.hbm2ddl.auto>validate</property>

<mapping class=Hibernate.Banco/>

<mapping class=Hibernate.Usercoede/>

<mapping class=Hibernate.Estagiario/>

<mapping class=Hibernate.Faculdade/>

</session-factory>

</hibernate-configuration>

No Oracle basta colocar após o comentário EJB3 @Entity:

@SequenceGenerator(name=“SEQ_BAN”,sequenceName=“SEQ_BANCO”)

e lá embaixo depois de @Id especificar o seu gerador o qual já foi criado no hibernate e tem um nome qualquer, exceto o sequenceName que deve representar o nome da sequência idem à nomeação no banco de dados:

@GeneratedValue(generator=“SEQ_BAN”)

Pra finalizar e dar um tchau e bença no Oracle está aqui o meu código de criação da sequence e da trigger,

create sequence “SEQ_BANCO” start with 1;

CREATE OR REPLACE TRIGGER  "BI_BANCO"

before insert on banco

for each row

begin

if :new.idbanco is null or :new.idbanco=0 then

select “SEQ_BANCO”.nextval into :NEW.idbanco from dual;

end if;

end;

valeu rapa, qualquer dúvida, já sabe! Caso possa ajudar ficarei feliz!

A

bom dia pessoal gostaria muito de uma ajuda
estou para comecar um projeto com flex e java e gostaria d saber o que melhor acessar o banco com hibernate ou jdbc o sistema sera feio 80% no banco deixando para fora so os forms EM FLEX e relatorios o restante sera feito no banco o que ,elhor hibernate ou jdbc

Criado 14 de maio de 2009
Ultima resposta 14 de jun. de 2010
Respostas 10
Participantes 3