Problema ao alterar de Optional = false para true

OK, possuo uma classe ItensCompras onde tenho um campo grade_produto_codGrade que estava setado como optional =false entao alterei para true mas ele não modificou no banco de dados o campo para aceitar null.
entao quando vou incluir um itensCompras ele lança o erro.

Classe da persistencia:


@Id
    @Basic(optional = false)
    @SequenceGenerator(name = "id", initialValue=1, allocationSize = 1)
    @GeneratedValue(strategy=GenerationType.TABLE, generator = "id")
    @Column(name = "CODITEMCOMPRA")
    private Integer coditemcompra;
    @Column(name = "NOMEPRODUTO")
    private String nomeproduto;
    @Column(name = "VALORPRODUTO")
    private Double valorproduto;
    @Column(name = "QTDPRODUTO")
    private Double qtdproduto;
    @Column(name = "ACREDESCREALPRODUTO")
    private Double acredescrealproduto;
    @Column(name = "TIPOUNPRODUTO")
    private String tipounproduto;
    @Column(name = "IPIPERPRODUTO")
    private Double ipiperproduto;
    @Column(name = "IPIREALPRODUTO")
    private Double ipirealproduto;
    @Column(name = "DESCPRODUTO")
    private String descproduto;
    @Column(name = "VALORICMSPRODUTO")
    private Double valoricmsproduto;
    @JoinColumn(name = "COMPRA_CODCOMPRA", referencedColumnName = "CODCOMPRA")
    @ManyToOne(optional = false)
    private Compra compraCodcompra;
    @JoinColumn(name = "GRADE_PRODUTOS_CODGRADE", referencedColumnName = "CODGRADE")
    @ManyToOne(optional = true)
    private GradeProdutos gradeProdutosCodgrade;
    @JoinColumn(name = "MATERIA_PRIMA_CODMATPRIMA", referencedColumnName = "CODMATPRIMA")
    @ManyToOne(optional = true)
    private MateriaPrima materiaPrimaCodmatprima;
    @Column(name = "SUBTOTALCOMPRA")
    private Double subtotalcompra;

Desde já, obrigado!

ta para criar a tabela quando roda?
tenta limpar a aplicação e restartar tudo

Esse que é o problema, minha base de dados já possui dados, preciso alterar sem danificar os dados…
alterando o campo diretamente via codigo ou algo assim.

JPA não é o meu forte mais acredito que não seja possivel fazer isso mantedo os dados(via codigo).
Tem q alterar direto no banco.

Vai direto no banco e altera.
mais facil. :smiley:

Entao, tenho varios clientes com esse mesmo sistema, gostaria de executar via codigo no banco de dados… tipo um script que executa no inicio do programa.
tipo… Alter Table x change bababa
utilizo o derbyDB, será que tem como?

edersongoulart , acho que o optional não é usado para isso, para habilitar a inserção de valores null você deve usar a propriedade nullable=true do @Collumn.
Não esqueça também de usar configuration.setProperty(“hibernate.order_updates”, “true”) para permitir a alteração do SQL.

vou testar então, já já mostro o resultado. Muito obrigado.

Não deu certo.

Implementei o nullable, ficou assim:

@JoinColumn(name = "GRADE_PRODUTOS_CODGRADE", referencedColumnName = "CODGRADE", nullable=true)
    @ManyToOne(optional = true)
    private GradeProdutos gradeProdutosCodgrade;

Propriedades do jpa:

<properties>
      <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="hibernate.connection.username" value="erpdb"/>
      <property name="hibernate.connection.password" value="erpdb"/>
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
      <property name="hibernate.order_updates" value="true"/>
    </properties>

Erro retornado:
Caused by: ERROR 23502: A coluna ‘GRADE_PRODUTOS_CODGRADE’ não aceita valor nulo.

creio que o nullable=true é apenas para campos "sem relacionamento"
e usado optional = true é para campo com relacionamento, não sei se essa informação é certa… mas to ficando puto com esse jpa. rsrsrs

alguma ideia :?:

Desde já agradeço.

Tive que botar na mão quando o sistema inicia.

usei "ALTER TABLE ITENS_COMPRAS ALTER COLUMN GRADE_PRODUTOS_CODGRADE NULL "

DerbyDb é o banco de dados

[quote=edersongoulart]Tive que botar na mão quando o sistema inicia.

usei "ALTER TABLE ITENS_COMPRAS ALTER COLUMN GRADE_PRODUTOS_CODGRADE NULL "

DerbyDb é o banco de dados[/quote]

Que bom que conseguiu resolver, não é como vc gostaria de fazer a príncipio mas é uma alternativa.
Teoricamente devia ter funcionado da forma como eu te sugeri, mas como não funcionou provavelmente o nullable=true só habilita a inserção de valores null apenas quando se cria a tabela, ou seja, vc deveria usar o hbm2ddl.auto como create, o que não é o seu caso, já que apagaria seus dados.

edersongoulart, você já resolveu seu problema mas só vou corrigir uma informação errada que te passei.
Para permitir a alteração do esquema SQL você dever usar o “hibernate.hbm2ddl.auto”, “update” e não o hibernate.order_updates", “true” como eu tinha dito em post desse tópico.

Abç