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.
Foi útil?

Solução

Para resolver este problema temos que:

  1. Mapeie EntityB.entityA para a mesma coluna que EntityB.ID.entityA_FK_ID
  2. definir atributos 'inseríveis' e 'atualizáveis' da anotação EntityB.entityA @JoinColumn
  3. 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
scroll top