É o sequinte:
Tenho 3 entidades: Funcionario, Endereco e Cidade mapeadas da seguinte forma:
Um funcionário tem uma naturalidade (instância de cidade) e um endereco. Este último possui uma cidade (outra instância de cidade).
Quando busco um funcionário que nasceu em São Paulo (id = 51) e que mora em Manaus (id=60) o hibernate/jpa cria corretamente duas instâncias de cidade: uma para a naturalidade do funcionário e outra para o endereço.
O problema é que quando o funcionário nasceu em São Paulo (id = 51) e mora em São Paulo (id=51) ele (hibernate/jpa) cria somente uma instância para as duas cidades.
Se eu altero o valor da naturalidade, por serem a mesma instância, automaticamente (como é de se esperar) ele altera a cidade do endereço.
Alguém já passou por algo semelhante?
@Entity(name = "Funcionario")
public class Funcionario implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
@ManyToOne(cascade = CascadeType.ALL, optional = false)
@JoinColumn(name = "idEndereco", referencedColumnName = "id", nullable = false)
private Endereco endereco;
@ManyToOne
@JoinColumn(name = "idCidadeNaturalidade", referencedColumnName = "id")
private Cidade naturalidade;
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Funcionario other = (Funcionario) obj;
if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 3;
hash = 67 * hash + (this.id != null ? this.id.hashCode() : 0);
return hash;
}
}
@Entity(name = "Endereco")
public class Endereco implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String logradouro;
private String numero;
@ManyToOne
@JoinColumn(name = "idCidade", referencedColumnName = "id")
private Cidade cidade;
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Endereco other = (Endereco) obj;
if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 7;
hash = 41 * hash + (this.id != null ? this.id.hashCode() : 0);
return hash;
}
}
@Entity(name = "Cidade")
public class Cidade implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
@OneToMany(mappedBy = "naturalidade")
private List<Funcionario> funcionarios;
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Cidade other = (Cidade) obj;
if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 5;
hash = 41 * hash + (this.id != null ? this.id.hashCode() : 0);
return hash;
}