Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

@JoinColumn(unique = true) não está funcionando

Segui os passos mostrados na aula, mas ao tentar executar o programa com a anotação @JoinColumn(unique = true). Aparece o erro Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;

Deletei o banco de dados e o criei novamente, mas não adiantou. Quando apenas comento a linha do JoinColumn e mantenho o resto: @OneToOne private Conta conta; o erro não aparece mais.

package br.com.alura.jpa.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

@Entity
public class Cliente {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String profissao;
    private String endereco;

    @JoinColumn(unique = true)
    @OneToOne
    private Conta conta;

    public Conta getConta() {
        return conta;
    }

    public void setConta(Conta conta) {
        this.conta = conta;
    }

    public Long getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getProfissao() {
        return profissao;
    }

    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

}

package br.com.alura.jpa.testes;

import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence;

import br.com.alura.jpa.modelo.Cliente; import br.com.alura.jpa.modelo.Conta;

public class TestaRelacionamentoClienteConta {

public static void main(String[] args) {

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("alura");
    EntityManager em = emf.createEntityManager();

    Conta conta = new Conta();
    conta.setId(1L);

    Cliente cliente = new Cliente();
    cliente.setNome("Roberto");
    cliente.setProfissao("professor");
    cliente.setConta(conta);

    em.getTransaction().begin();

    em.persist(cliente);

    em.getTransaction().commit();
    em.close();




}

}

6 respostas

Sobre o erro "Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;" geralmente isso ocorre por conta da versão do Hibernate.

O seu pom.xml está confome abaixo?

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>br.com.alura.jpa</groupId>
    <artifactId>projeto-jpa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-agroal</artifactId>
            <version>5.4.10.Final</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
    </dependencies>
</project>

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="alura">
        <class>br.com.alura.jpa.modelo.Conta</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/alura_jpa?serverTimezone=UTC" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="" />

            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MariaDBDialect"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

Qual versão do MariaDBDialect você está tentando se conectar?

Olá Otávio, vou dar uma olhada . Já te retorno.

No caso do pom as dependencias estão diferentes. O arquivo também começa e termina com <project ...

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>br.com.alura.jpa</groupId>
    <artifactId>projeto-jpa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>6.0.0.Alpha5</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>                        
    </dependencies>
</project>

O arquivo persistence.xml está assim:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="alura">
        <class>br.com.alura.jpa.modelo.Conta</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/alura_jpa?serverTimezone=UTC" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="" />

            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MariaDBDialect"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

Ao comparar o que você postou, tive a impressão de que estão iguais.

A versão do MariaDB é 10.4.12

Vou alterar o pom e deixá-lo como o que você me passou. Aguardo demais instruções, obrigado.

Deixando o hibernate na versão 5.4.10.Final é para resolver esse erro "@JoinColumn(unique = true). Aparece o erro Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;", aguardo seu retorno

Bom dia, infelizmente eu mudei a versão do hibernate para a 5.4.10.Final mas problema persiste. Quanto inserir um cliente novo neste classe:

package br.com.alura.jpa.testes;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import br.com.alura.jpa.modelo.Cliente;
import br.com.alura.jpa.modelo.Conta;

public class TestaRelacionamentoClienteConta {

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("alura");
        EntityManager em = emf.createEntityManager();

        Conta conta = new Conta();
        conta.setId(1L);

        Cliente cliente = new Cliente();
        cliente.setNome("Roberto");
        cliente.setProfissao("professor");
        cliente.setEndereco("Rua Independencia, 15");
        cliente.setConta(conta);

        em.getTransaction().begin();

        em.persist(cliente);

        em.getTransaction().commit();
        em.close();

    }

}

Com esta anotação na classe Cliente

@JoinColumn(unique = true) 
    @OneToOne
    private Conta conta;

O console mostra a mesma exceção. Mas ao comentar a anotação @JoinColumn(unique = true), não há mais exceções, e o cliente é criado. Pois verifico a tabela no MariaDB e cliente é mostrado lá.

solução!

Recomecei o projeto do zero e consegui resolver o problema. Só não sei exatamente o que fiz diferente.