我需要对项目模型进行更改。现在我们有两个具有双向多对多关系的类(这意味着在关系表中),现在需要为关系添加额外的信息。
我的问题是:唯一的方法是为关系创建一个类(例如,创建一个与已存在的关系表的名称相同的类)?
我问它是因为如果我们需要在项目中改变上述关系,那么改变将会非常有影响,几乎整个项目都是如此(严重)。
我正在谈论的两个课程,只是为了让它更清晰:
@Entity
public class Serie extends AbstractEntity {
@ManyToMany
private List<Disciplina> disciplinas;
}
@Entity
public class Disciplina extends AbstractEntity {
@ManyToMany(mappedBy = "disciplinas")
private List<Serie> series;
}
答案 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