0

我发现播放框架有问题。我也可以重现它,所以在这里我将展示一个简化的重现场景。

启动播放应用程序时,我想从 yaml 文件中读取示例数据。因此,我使用类 Fixtures。在 yaml 文件中,我准备了相互关联的对象的数据结构。

数据结构的模型类如下所示:

@Entity
public class Album extends Model{
 public String name;
 @ManyToOne
 public Artist artist;
}
@Entity
public class Artist extends Model{
 public String name;
 @OneToMany(mappedBy="artist")
 public List<Album> albums = new ArrayList<Album>();
}

我用来加载 yaml 文件并控制结果的作业如下所示:

@OnApplicationStart
public class Bootstrap extends Job {
@Override
public void doJob(){
    Fixtures.deleteAllModels();
    Fixtures.loadModels("sample.yml");
    List<Artist> artists = Artist.findAll();
    for (Artist artist : artists) {
        play.Logger.info(artist.name + " has " + artist.albums.size() + " albums");
    }        
}
}

如果我在我的 yml 文件中使用以下结构,那么它可以工作:

Artist(b1):
  name: Nirvana
Artist(b2):
  name: ACDC
Album(a1):
  name: Back in Black
  artist: b2
Album(a2):
  name: Highway to Hell
  artist: b2
Album(a3):
  name: Nevermind
  artist: b1
Album(a4):
  name: Bleach
  artist: b1

但是,如果我这样做,那么它将无法正常工作:

Album(a1):
  name: Back in Black
Album(a2):
  name: Highway to Hell
Album(a3):
  name: Nevermind
Album(a4):
  name: Bleach
Artist(b1):
  name: Nirvana
  albums: [a3,a4]
Artist(b2):
  name: ACDC
  albums: [a1,a2]

但是,此处的文档告诉我们,第二种方法应该有效。

我在示例代码中是否犯了错误,或者这真的是播放框架或 JPA 的问题?

4

1 回答 1

1

不,根据文档,您的第二次尝试不应该奏效。问题在于关系所有者的概念。保持双向关系时,仅会咨询所有者方(由 mappedby 引用的一方)。

在你的情况下

Artist(b1):
  name: Nirvana
  albums: [a3,a4]

对以下列表进行操作,该列表不是关系所有者:

 //owner of this relationship if attribute artist in Album entity.
 @OneToMany(mappedBy="artist")
 public List<Album> albums = new ArrayList<Album>();

您的第一次尝试使用artist. Album它有效,因为它是和artist之间双向关系的所有者。由于同样的原因,您链接的文档中的示例也有效。AlbumArtist

于 2012-08-16T07:15:37.020 回答