多对多Spring Data JPA关系中的额外列,只需极少的更改

时间:2018-05-07 21:33:49

标签: java jpa

我需要对项目模型进行更改。现在我们有两个具有双向多对多关系的类(这意味着在关系表中),现在需要为关系添加额外的信息。

我的问题是:唯一的方法是为关系创建一个类(例如,创建一个与已存在的关系表的名称相同的类)?

我问它是因为如果我们需要在项目中改变上述关系,那么改变将会非常有影响,几乎整个项目都是如此(严重)。

我正在谈论的两个课程,只是为了让它更清晰:

@Entity
public class Serie extends AbstractEntity {
   @ManyToMany
   private List<Disciplina> disciplinas;
}

@Entity
public class Disciplina extends AbstractEntity {
   @ManyToMany(mappedBy = "disciplinas")
   private List<Serie> series;
}

1 个答案:

答案 0 :(得分:0)

根据评论中的建议,您需要一个连接实体,但不需要将其公开给您的域模型的客户端:通过执行类似下面的操作,您只需要更改任何直接修改集合的客户端代码来调用addXXX / removeXXX方法。没有客户端代码只知道Join实体。因此,对Java代码的更改应该是次要的。

至于查询,您显然需要根据需要更改这些。

甲级

@Entity
public class Serie extends AbstractEntity {

    @OneToMany(mappedBy = "serie")
    private List<SerieDisciplina> serieDisciplinas;

    public List<Disciplina> getDisciplinas(){
            //disciplinas extracted from serieDisciplinas 
            return Collections.unmodifiableList(...); 
    }

    public void addDisciplina(Disciplina disciplina){
        SerieDisciplina sd = new SerieDisciplina();
        sd.stSerie(this);
        sd.setDisciplina(disciplina);

        serieDesciplinas.add(sd);   
    }
}

Disciplina

@Entity
public class Disciplina extends AbstractEntity {

    @ManyToMany(mappedBy = "disciplina")
    private List<SerieDisciplina> serieDisciplinas;

    public List<Serie> getSeries(){
        //series extracted from serieDisciplinas
        return Collections.unmodifiableList(...); 
    }

    public void addSerie(Serie serie){
        SerieDisciplina sd = new SerieDisciplina();
        sd.stSerie(Serie);
        sd.setDisciplina(this);

        serieDesciplinas.add(sd);
    }
}

加入实体

@Entity 
public class SerieDisciplina{
    @ManyToOne
    private Serie serie;

    @ManyToOne
    private Disciplina disciplina;

    //fields for the additional data about the relationship

    //getters and setters
}

Hibernate文档建议首先避免@ManyToMany以避免此类问题。请参阅讨论:Hibernate Best Practices: Avoiding Many-To-Many and 'exotic' relationships