EBeans в Play Framework

t1h0n0ff

Совсем недавно принялся изучать Play Framework. Решил что стоит попробовать вместо привычного JPA что-то новенькое. Выбор был не особо велик - EBean.
Допустим ситуацию.
Есть альбома, а в нем фотографии:
Альбом:
 
class Album extends Model {
@Id
Long id;

@ManyToOne
Photo cover;

@OneToMany(cascade = CascadeType.ALL)
List<Photo> photos;
}

Альбом в себе имеет в себе фотографии и одна из фотографий является обложкой.
Фото:
 
class Photo extends Model {
@Id
Long id;

@ManyToOne
Album album;
}

Собственно ситуация:
  
Photo photo1 = new Photo();
Photo photo2 = new Photo();

Album album = new Album();
album.photos.add(photo1);
album.photos.add(photo2);
album.save();

album.cover = photo1;
album.update();

album.delete();

На последней строчке будет ексепшн, собственно ситуация понятна, при каскадном удалении удаляются все фотографии в альбоме, а одна из них ссылается на альбом - cover (обложка), то есть присутствует некоторая цикличность. Что нужно сделать, чтобы удаление прошло успешно?

Aggressiv

Я просто проходил мимо...
Но может ссылку на обложку держать в альбоме, а не в обложке на альбом?

katrin2201

Я бы попробовал для начала убрать "@ManyToOne" у "Photo cover;". Он там как-то не в тему.

t1h0n0ff

Я просто проходил мимо...
Но может ссылку на обложку держать в альбоме, а не в обложке на альбом?
Так вроде так и есть.

t1h0n0ff

Я бы попробовал для начала убрать "@ManyToOne" у "Photo cover;". Он там как-то не в тему.
Проблема все таки в генерации ddl создания структуры базы. А именно когда вешает на сущность "on delete". EBeans это делает крайне криво. Буду дома скину что именно он нагенерил.
Вообще как я понял такие вещи не стоит доверять ему, хотя Hibernate с этим справляется достаточно хорошо.

katrin2201

Так это может и ddl исправит...

t1h0n0ff

Так это может и ddl исправит...
проблема в том, что EBean неверно понимает аннотации jpa.
Например, если написать
 
@Column(nullable = false)

То в ddl он не обозначит поле как "NOT NULL".

t1h0n0ff

Проблема остается.
При удалении альбома, мы говорим чтобы каскадно удалялись фотографии, при каскадном удалении фотографии мы возвращаемся к альбому, так как одна фотография является обложкой для альбома.
Если так, то:
 
alter table album add constraint fk_album_cover_1 foreign key (cover_id) references photography (id) on delete cascade;

то получается циклическая зависимость, то есть опять пришли к альбому.
Если
 
alter table album add constraint fk_album_cover_1 foreign key (cover_id) references photography (id) on delete set null;

то получаем javax.persistence.OptimisticLockException
Перевести флан на фото, что оно является обложкой мне кажется не оптимальным и этот подход не удовлетворяет целостности данных, то есть можно программно сделать так, чтобы у альбома было 2 обложки.
Как быть? Может у кого есть мысли?
Оставить комментарий
Имя или ник:
Комментарий: