如何在Java中表示1..n关系

时间:2013-08-29 11:46:51

标签: java

假设我有两个类:一个用于Band,一个用于CD。我希望能够轻松访问一个乐队的所有CD并找到CD的乐队。

我的解决方案是在CD中使用字段Band,在频段中使用ArrayList<CD>

但我发现这不是一个好的解决方案。有没有人知道这个场景有更好的设计?

4 个答案:

答案 0 :(得分:3)

我明白为什么你不喜欢这个解决方案。

您只存储一次信息,但必须在两个类中更新更改。

如果您更改Band的{​​{1}},则必须从旧版CD中移除CD,在{{Band中设置Band 1}},然后将其添加到新的CD

这当然很复杂,容易出错。

您的课程没有简单的getter / setter。相反,您必须在域类中实现大量逻辑以保持一致性。

当然,优势在于您总是Band Band可访问,反之亦然。这是一个权衡。例如,您应该使用CD的{​​{1}}作为其CD实施的一部分。

这是一个有趣的替代,在某些情况下可能是有利的:

仅将您的课程Bandequals用作简单的POJO,并使用其他课程(即Band)来解决这种关系:

CD
  • 优势:关注点分离,无国籍服务
  • 缺点:更多代码

答案 1 :(得分:1)

你的解决方案完全有道理。实际上,这是JPA的原则。 见Java Persistence/OneToMany。 JPA是如何实现自己的ORM的很好的参考。

答案 2 :(得分:0)

你可以在Band类中拥有Set张CD。

或者,在Band类中保留一个唯一的ID,它将使用多张CD映射每个唯一的Band。

根据我的理解,CD中不需要有Band字段。

答案 3 :(得分:0)

您没有存储两次信息:CD只保存指向Band类的指针。 如果在C ++中完成,那么这需要一些思考(例如,cd中的weak_ptr到Band以避免循环引用),但是在Java中,当Band未在其他任何地方被引用时,GC将负责删除两个对象。

您可以通过编写一些处理此问题的代码来确保某些一致性(例如CD只在一个波段中),如下面的代码(警告:未测试):

class Band
{
 private List<CD> m_cds;

 public void addCD(CD cd)
 {
  id(cd.getBand() == this)
  {
   return;
  }
  if(cd.getBand() != null)
  {
   cd.getBand().removeCd(CD cd);
  }
  cd.setBand(this);
  m_cds.add(cd);
 }

 public void removeCd(CD cd)
 {
  cd.setBand(null);
  m_cds.remove(cd);
 }
}


class CD
{
 private Band m_band;

 public void setBand(Band band)
 {
  m_band = band;
 }

 public Band getBand()
 {
  return m_band;
 }
}