OrderedColumn в комбинации playframe дает мне для всех записей 0 в качестве индекса - PullRequest
1 голос
/ 15 июля 2011

У меня есть следующая модель (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 , но это не работает.Так что мне интересно, если это не работает в сочетании с игровой структурой.

Любые идеи?

BR, Рене

Ответы [ 3 ]

1 голос
/ 15 июля 2011

Единственное различие между тем, что у вас есть, и тем, что показывает документ Hibernate, заключается в том, что вы не используете аннотацию @JoinColumn.Я знаю, что вы конкретно упоминаете объединение в параметрах аннотации @OneToMany, но это единственное конкретное отличие, которое я вижу.

В документации сказано:

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

Так что, возможно, ваш код должен читать1007 *

@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 голос
/ 16 июля 2011

Я наконец нашел рабочее решение здесь :

@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_id, images_id и position_index, на этот раз обновлены в соответствии со значениями в списке.

0 голосов
/ 15 июля 2011

Я не вижу, чтобы вы устанавливали значение позиции в любой точке.Установка позиции в качестве поля для упорядочения только означает, что список будет упорядочен в соответствии со значением этого поля, но вам нужно будет установить это значение.

...