Hibernate JPA não cria todas Tabelas no banco dados [RESOLVIDO]

6 respostas Resolvido
back-endjpajsfhibernate
M

Pessoal, bom dia.
Preciso de ajuda da comunidade.
Estou com um problema ao gerar tabelas no banco de dados do oracle usando Hibernate / JPA.

Vamos lá,
O banco de dados existe, já está tudo ok, a comunicação existe também. Como sei disso?
Algumas tabelas são criadas, na verdade 9/11

Duas classes não conseguem gerar a tabelas, sendo elas ‘Pessoas’ e ‘Produto’.

Habilitei para mostrar o codigo sql do hibernate e tudo parece estar certo, existe algum log a mais que posso habilitar na configuração ?

Não existe outra tabela/view com o nome da tabela.

Segue meu config do hibernate:

<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
	<property name="hibernate.connection.datasource">java:/comp/env/jdbc/datasource</property>
	<property name="hibernate.default_schema">XXX</property>
	<property name="hibernate.current_session_context_class">thread</property>
	<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
	<property name="hibernate.jdbc.factory_class">org.hibernate.jdbc.NonBatchingBatcherFactory</property>
	<property name="hibernate.jdbc.batch_size">100</property>
	<property name="hibernate.cache.use_second_level_cache">true</property>
	<property name="hibernate.transaction.auto_close_session">true</property>
	<property name="hibernate.hbm2ddl.auto">update</property>
	<property name="hibernate.show_sql">true</property>
	<property name="hibernate.format_sql">true</property>
	<property name="hibernate.generate_statistics">false</property>
	<property name="hibernate.use_sql_comments">false</property>
	<property name="hibernate.connection.autocommit">false</property>
	<property name="hibernate.connection.pool_size">50</property>

Uma das classes que não funcionaram:

@Audited
@Entity
@Table(name = "w_pessoa")
@SequenceGenerator(name = "w_pessoa_seq", sequenceName = "w_pessoa_seq", initialValue = 1, allocationSize = 1)
public class Pessoa implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "w_pessoa_seq")
@SequenceGenerator(name = "w_pessoa_seq", sequenceName = "w_pessoa_seq", allocationSize = 1, initialValue = 1)
private Long pes_codigo;

@Column(length = 150, nullable = false)
private String pes_nome;

@Column(length = 150, nullable = true)
private String pes_razao;

@Column(nullable = true)
private Boolean pes_cliente = false;

@Column(nullable = true)
private Boolean pes_fornecedor = false;

@Column(nullable = true)
private Boolean pes_tranportadora = false;

@Column(nullable = true)
private Boolean pes_outro = false;

@Column(nullable = true)
private Boolean pes_funcionario = false;

@Column(nullable = true)
private Boolean pes_usuario = false;

@Column(nullable = true)
private Boolean pes_vendedor = false;

@Column(nullable = true)
private Boolean pes_comprador = false;

@Column(nullable = true)
private Boolean pes_ativo = true;

@Column(length = 20)
private String pes_tipo_pessoa = "Juridica";

@Column(length = 20)
private String pes_cep;

@Column(length = 100)
private String pes_endereco;

@Column(length = 100)
private String pes_end_numero;

@Column(length = 50)
private String pes_complemento;

@Column(length = 50)
private String pes_bairro;

@Column(length = 50)
private String pes_cidade;

@Column(length = 50)
private String pes_uf;

@Column(length = 16)
private String pes_fone;

@Column(length = 16)
private String pes_fone2;

@Column(length = 15)
private String pes_fax;

@Column(length = 17)
private String pes_celular;

@Column(length = 17)
private String pes_celular2;

@Column(length = 80)
private String pes_contato;

@Column(length = 17)
private String pes_cel_contato;

@Column(length = 100)
private String pes_emailcontato;

@Column(length = 100)
private String pes_email;

@Column(length = 100)
private String pes_emailmovimento;

@Column(length = 100)
private String pes_pathPhoto;

@Column(columnDefinition = "text")
private String pes_observacao;

@Column(length = 19)
private String pes_cnpj;

@Column(length = 19)
private String pes_ie;

@Column(length = 15)
private String pes_cpf;

@Column(length = 15)
private String pes_rg;

@Column(scale = 4, precision = 15)
private BigDecimal pes_desconto_padrao = BigDecimal.ZERO;

@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date pes_datacadastro = new Date();

@Temporal(TemporalType.DATE)
private Date pes_datanascimento;

@Column(length = 1)
private String pes_sexo;

@Column(length = 20, nullable = true, unique = true)
private String pes_login = null;

@Column(length = 20, nullable = true)
private String pes_senha = null;

@Temporal(TemporalType.TIMESTAMP)
private Date pes_ultimoacesso;

@Column(length = 100)
private String ent_pathPhoto;

    *Getters e setters*

6 Respostas

V

Bom dia amigo.

Vi que você está utilizando um banco de dados da Oracle, as tabelas muitas vezes não são criadas por erros na anotações e quando isso ocorre o framework para na tabela que deu erro na sequência de declaração das classes de entidade, nessa classe eu vi que você usou a anotação GeneratedValue duas vezes, não há necessidade disso, tem um campo de data sem a anotação de coluna pes_datanascimento e tem vários campos do tipo booleano (tive problemas para criar campos assim) geralmente eu coloco uma definição para coluna Column(name = “Coluna_1”, columnDefinition = “boolean”) .

Os erros de criação de tabela não são isolados e nem destacados pelo framework, você precisa ver todo o código gerado pelo hibernate para encontrar os problemas.

Espero ter ajudado! :smiley:

J

Cria as tabelas sob demanda e sob seu controle, senão vai ficar quebrando a cabeça com n configurações por uma questão tão simples no dia a dia, como criação de tabela.

M

Tirei a maioria dos campos e foi. Vou verificar um a um pra ver qual é o causador do problema e volto aqui pra esclarecer.

Os campos booleanos não tive problema, sobre os campos sem anotação, eu nem tinha reparado…rs… Obg pela dica, logo mais volto com resultados dos testes.

M

Na vdd essas classes estavam todas funcionando no mysql, quando migrei as mesmas para o oracle que aconteceu isso. Mas é boa sua dica, vou refazer as classes com problema.

vlw amigo.

V

Caso você troque de banco de dados com certa frequência eu aconselho usar uma ferramenta de controle de versionamento com essa finalidade, eu aconselho usar o Flyway se for para escrever o código SQL de criação das tabelas.

Eu utilizo o controle de versionamento oferecido pela Oracle e atualmente estou trabalhando com bancos de dados paralelos em um mesmo sistema sendo eles Oracle, Derby e Mongo. As classes de entidade compartilhadas entre Oracle e Derby nunca deram nenhum problema de migração e anteriormente eu estava utilizando o MySql no lugar do Derby.

M
Solucao aceita

Primeiramente quero agradecer aos amigos pela ajuda prestada.
Acabei descobrindo a incompatibilidade do oracle com a [ columnDefinition = “text” ]

O problema estava em:

@Column(columnDefinition = "text")
    private String pes_observacao;

Resolvi usando @Lob para os campos de textos grandes, ficando:

@Lob
    @Column(nullable = true)
    private String pes_observacao;

:wink:

Criado 3 de janeiro de 2019
Ultima resposta 3 de jan. de 2019
Respostas 6
Participantes 3