组合游戏框架中的有序列为我提供了所有条目0作为索引

时间:2011-07-15 09:28:39

标签: hibernate jpa jpa-2.0 playframework

我有以下模型(playframework):

@Entity
public class Album extends Model{

    public Album(){
        this.creationDate = new Date();
    }

    public Album(String name){
        this.creationDate = new Date();
        this.name = name;
    }

    @Required
    @Column(unique = true)
    public String name;
    @Temporal(javax.persistence.TemporalType.DATE)
    public Date creationDate;
    @OneToMany(cascade=CascadeType.ALL, mappedBy="album")
    @OrderColumn(name="position")
    public List<Image> images = new ArrayList<Image>();    
}

@Entity
public class Image extends Model {

    public Image(String description) {
        this.description= description;
    }
    @Required
    public String description;
    @Required
    @ManyToOne
    @JoinColumn(name="album_id", nullable=false)
    public Album album;
    @Column(name="position")
    public int position;

    public void addAlbum(Album album){
        this.album = album;
        album.images.add(this);
    }
}

在我的测试中,我会执行以下操作:

@Test
public void indexColumn(){
    Album album = new Album("newalbum");
    Image image1 = new Image("newimage1");
    Image image2 = new Image("newimage2");
    image1.addAlbum(album);
    image2.addAlbum(album);
    album.save();

}

当我查看数据库时,我可以看到两个图像的位置都是0。我想我确实完成了hibernate doc Hibernate Documentation中的内容,但它没有用。所以我想知道这是否与play框架结合使用。

任何想法?

BR,Rene

3 个答案:

答案 0 :(得分:1)

您拥有的内容与Hibernate文档所显示的内容之间的区别在于您不使用@JoinColumn注释。我知道你特别提到了@OneToMany注释参数中的连接,但这是我能看到的唯一具体差异。

文档说

@OneToMany
@OrderColumn(name="order")
@JoinColumn(name="parent_id", nullable=false)
private List<Child> children;

所以也许你的代码应该是

@OneToMany(cascade=CascadeType.ALL)
@OrderColumn(name="position")
@JoinColumn(name="album_id", nullable=false)
public List<Image> images = new ArrayList<Image>(); 

我不认为Play会采取不同的行为,因为它只是在引擎盖下使用Hibernate来执行你想要做的事情。我能想到的另一件事是,Hibernate文档版本与Play附带的版本之间存在版本问题。

答案 1 :(得分:1)

我终于找到了一个有效的解决方案here

@Entity
public class Album extends Model{

    public Album(){
        this.creationDate = new Date();
    }

    public Album(String name){
        this.creationDate = new Date();
        this.name = name;
    }

    @Required
    @Column(unique = true)
    public String name;
    @Temporal(javax.persistence.TemporalType.DATE)
    public Date creationDate;
    @OneToMany(cascade=CascadeType.ALL, mappedBy="album")
    @OrderColumn(name="position_index")
    public List<Image> images = new ArrayList<Image>();    
}

@Entity
public class Image extends Model {

    public Image(String description) {
        this.description= description;
    }
    @Required
    public String description;
    @Required
    @ManyToOne
    public Album album;

    public void addAlbum(Album album){
        this.album = album;
        album.images.add(this);
    }
}

通过该映射,Hibernate创建了一个新表:album_image,其中包含album_idimages_idposition_index,这次更新对应于列表中的值。

答案 2 :(得分:0)

我没有看到你在任何时候设置位置的值。将位置设置为仅按顺序排列的字段意味着将根据该字段的值对列表进行排序,但您需要设置该值。