https://www.ramkitech.com/2011/11/jsf-jpa-jasperreports-ireport.html
https://www.ramkitech.com/2012/06/jsf-jpa-jasperreports-ireport-part-2.html
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;
}
Nota do livro: 6.
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;
}
}
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 {}
Um exemplo simples de como usar o @Embedded:
@Entity
public class Employee {
// ...
@Embedded
private Address address;
// ...
}
@Embeddable
public class Address {
private String street;
private String city;
private String state;
private String zip;
// ...
}