Arquivo da tag: JPA

JPA – Mapeamento com chave composta

Municipio

@Entity
@Table(name = "municipio")
public class Municipio {

	@EmbeddedId
	private MunicipioPK id;

	@Column(name = "DSC_MUNICIPIO")
	private String nome;

	@Column(name = "NUM_CEP")
	private Long cep;

	@ManyToOne
	@JoinColumn(name = "COD_UF", referencedColumnName = "COD_UF", insertable = false, updatable = false)
	private UnidadeFederacao uf;
}

MunicipioPK

@Embeddable
public class MunicipioPK implements Serializable {

	@Column(name = "COD_MUNICIPIO")
	private Integer idMunicipio;

	@Column(name = "COD_UF")
	private Integer idUnidadeFederacao;
}

UnidadeFederativa

@Entity
@Table(name = "unidade_federacao")
public class UnidadeFederacao {

	@Id
	@Column(name = "cod_uf")
	private Integer id;

	@Column(name = "dsc_uf")
	private String nome;

	@Column(name = "nom_sigla_uf")
	private String sigla;

	@OneToMany(mappedBy = "uf", fetch = FetchType.LAZY)
	private List municipios;
}

Como pegar a conexão usando JPA ou Hibernate

Eu passei por um problema que era usar a mesma conexão que eu usava no projeto para usar no meu relatório com o ireports.
Para resolver esse problema usei esse código.

public class ReportsRepository {

    private EntityManager entityManager;
    
    public ReportsRepository(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
    
    public Connection getConnection() {
        try {
            EntityManagerImpl factory = (EntityManagerImpl) entityManager;
            SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) factory.getSession().getSessionFactory();
            return sessionFactoryImpl.getConnectionProvider().getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

@MappedSuperclass ou @Inheritance

Quando você usa a anotação @MappedSuperclass, quando gerar as tabelas ela não será gerada e sim as classes filhas dela exemplo:

@MappedSuperclass 
abstract class  Animal {}

@Entity
class Cao extends Animal {}

@Entity
class Gato extends Animal {}

@Entity
class Leao extends Animal {}

No banco as tabelas que vão ser criadas serão Cao, Gato e Leao. Caso você queira a a tabela de Animal sejá gerada então será preciso mudar a anotação para @Inheritance, que no caso tem três possíveis estratégias de mapeamento – INGLE TABLE, TABLE PER CLASS ou JOINED. Ficaria assim:

@Entity
@Inheritance(strategy = InheritanceType.JOINED) 
abstract class  Animal {}

@Entity
class Cao extends Animal {}

@Entity
class Gato extends Animal {}

@Entity
class Leao extends Animal {}