Coluna de mapeamento Ebean EmbeddedId para relação ManyToOne
-
21-12-2019 - |
Pergunta
Estou enfrentando um problema com o Ebean ao tentar criar Chaves Compostas (EmbeddedId).
Este é um rascunho do que tenho:
@Entity public class EntityA extends Model{
@Id
private String ID;
@OneToMany
private List<EntityB> listEntitesB;
public EntityA(){
ID = UUID.randomUUID();
}
}
@Entity public class EntityB extends Model{
@EmbeddedId
private EntityB_PK ID;
@ManyToOne
@JoinColumn(name="entityA_fk", referencedColumnName="listEntitiesB")
private EntityA entityA;
public EntityB(String entityB_ID){
ID = new EntityB_PK(UUID.randomUUID(), entityB_ID);
}
}
@Embeddable public class EntityB_PK{
private String entityB_ID;
private String entityA_FK_ID;
public EntityB_PK(String entB_ID, String entA_FK_ID){
entityB_ID = entB_ID;
entityA_FK_ID = entA_FK_ID;
}
}
Observação:Estou usando o Ebean 4.1.4 com Java 1.6.
Então, esse código funciona bem, mas há uma vantagem que estou tentando resolver - a tabela resultante no banco de dados fica assim:
- entidadeB_ID [primário]
- entidadeA_FK_ID [primário]
- entidadeA_fk
Como você pode ver, a última coluna é redundante considerando a coluna "entityA_FK_ID".
O que eu gostaria de ter?
- Gostaria de poder dizer ao Ebean para usar a coluna "entityA_FK_ID" para a associação @ManyToOne em vez de criar sua própria coluna.
Solução
Para resolver este problema temos que:
- Mapeie EntityB.entityA para a mesma coluna que EntityB.ID.entityA_FK_ID
- definir atributos 'inseríveis' e 'atualizáveis' da anotação EntityB.entityA @JoinColumn
- Substituir setter de EntityB.entityA
Aqui está o código:
EntidadeA.java:
@Entity
public class EntityA extends Model {
@Id
private String ID;
@OneToMany(mappedBy="entityA")
public List<EntityB> listEntitesB;
public static Finder<String,EntityA> find = new Finder<String,EntityA>(
String.class, EntityA.class
);
public EntityA() {
ID = UUID.randomUUID().toString();
}
public String getID() {
return ID;
}
}
EntidadeB.java:
@Entity
public class EntityB extends Model {
@EmbeddedId
private EntityB_PK ID;
@ManyToOne
@JoinColumn(name = "entityA_fk_id", insertable = false, updatable = false)
private EntityA entityA;
public EntityA getEntityA() {
return entityA;
}
public void setEntityA(EntityA aEntityA) {
entityA = aEntityA;
ID.entityA_FK_ID = aEntityA.getID();
}
public EntityB(String entityB_ID){
ID = new EntityB_PK(UUID.randomUUID().toString(), entityB_ID);
}
public String getID() {
return ID.entityB_ID;
}
}
EntidadeB_PK.java:
@Embeddable
public class EntityB_PK implements Serializable {
public String entityB_ID;
@Column(name="entityA_fk_id")
public String entityA_FK_ID;
public EntityB_PK(String entB_ID, String entA_FK_ID){
entityB_ID = entB_ID;
entityA_FK_ID = entA_FK_ID;
}
@Override
public int hashCode() {
return entityB_ID.length() + entityA_FK_ID.length();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
EntityB_PK b = (EntityB_PK)obj;
if(b==null)
return false;
if (b.entityB_ID.equals(entityB_ID) && b.entityA_FK_ID.equals(entityA_FK_ID)) {
return true;
}
return false;
}
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow