Я столкнулся с той же проблемой и решил ее, используя атрибут mappedBy аннотации @OneToMany в классе A:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "m_a")
private Set<B> b;
Здесь m_a - это поле в классе B, которое относится к классу A:
@JoinColumn(name = "aId", nullable = false)
@ManyToOne
private A m_a;
Таким образом, @JoinColumn указывается только в одном месте, без дублированного кода.