2014-12-31 1 views
1

У меня есть простой класс Entity;Ebean не сохраняется внешние ключи

case class Place(var name: String) extends Model with GeoLocPoint with HasGeoLoc with ContainsTime with HasId { 

    var number: String = _ // Building number on the street. 
    var placeGroupId: Long = _ 
    var chainId: Long = _ 
    @OneToOne 
    @JoinColumn(name = "logo_id") 
    var logo: Image = _ 
    @OneToOne 
    @JoinColumn(name = "cover_id") 
    var cover: Image = _ 
... 
} 

И класс изображения;

package models.images 

import javax.persistence.Entity 

import models.HasId 
import models.places.placegroups.places.{Place, LinkedToPlace} 
import play.api.libs.json._ 
import play.db.ebean.Model 
import play.db.ebean.Model.Finder 

/** 
* Created by asheshambasta on 31/12/14. 
*/ 
@Entity 
case class Image(
        filePath: String, 
        src: String, 
        format: String, 
        role: String // C: cover, L: logo, G: gallery 
       ) extends Model with HasId with LinkedToPlace { 
    var caption: String = _ 
} 

Теперь, когда место создано, я прикрепляю к нему образ по умолчанию;

newPlace.save 
    val imgDir = Play.current.configuration.getString("static.dir").getOrElse("/tmp") 
    val imgUrl = Play.current.configuration.getString("static.url.img").getOrElse("/static/img") 
    val imgType = Play.current.configuration.getString("img.default.type").getOrElse("image/jpeg") 
    val coverFile = Play.current.configuration.getString("img.default.cover.file").getOrElse("default-cover.jpg") 
    val logoFile = Play.current.configuration.getString("img.default.cover.file").getOrElse("default-cover.jpg") 
    val cover = new Image(imgDir + "/" + coverFile, imgUrl + "/" + coverFile, imgType, "C") 
    cover.place = newPlace 
    cover.save 
    val logo = new Image(imgDir + "/" + logoFile, imgUrl + "/" + logoFile, imgType, "L") 
    logo.place = newPlace 
    logo.save 
    newPlace.cover = cover 
    newPlace.logo = logo 
    newPlace.update 

Но каждый раз, когда я вижу, что изображения некорректного сохранялись с правой place_id, но место логотипа и крышкой нет. Они остаются недействительными.

Это кажется прямым, но все же оно не работает. Есть ли у кого-нибудь указания на то, почему?

+0

Был мой ответ полезным? Я не получил от вас никакой обратной связи. – rtruszk

ответ

1

В представленном коде есть некоторые недостатки. Существует

logo.place = newPlace 

но нет place поля в Image классе.

Существует также place_id указанная колонка, но я не вижу ее в коде. Но есть logo_id и cover_id столбцы. Когда вы выполняете взаимно-однозначное отношение, вы должны добавить join-column только с одной стороны этого отношения. Таким образом, это должно быть только logo_id и cover_id столбцов на таблице Place. Добавление таблицы place_id на таблицу Image не будет работать, потому что в таблице было бы две строки с тем же place_id, и это было бы невозможно отличить от того, что должно быть отображено на поле logo и которое должно быть полем cover.

Я внесла некоторые исправления и упрощения, чтобы этот код был скомпилирован и работал.

Place.scala:

@Entity 
class Place(var aId: Int, var aNumber: String) extends Model{ 

    @Id 
    val id:Int=aId 

    @Column(name="number") 
    var number: String = aNumber 

    @OneToOne 
    @JoinColumn (name = "logo_id") 
    var logo: Image = _ 

    @OneToOne 
    @JoinColumn(name = "cover_id") 
    var cover: Image = _ 
} 

Image.class: метод

@Entity 
@Table(name = "image") 
class Image(var aId: Int, var aCaption: String) extends Model { 

    @Id 
    val id:Int=aId 

    @Column(name="caption") 
    var caption: String = aCaption 
} 

тест:

"EbeanTest" should { 
    "placeTest" in new WithApplication { 

     val newPlace = new Place(1, "aaa") 
     newPlace.save 

     val logo: Image = new Image(1, "111"); 
     logo.save 

     val cover: Image = new Image(2, "222"); 
     cover.save 

     newPlace.logo=logo 
     newPlace.cover=cover 
     newPlace.update 


     val cList = Ebean.find(classOf[Place]).findList() 
     for (
      element <- cList 
     ) println(element.id+" "+element.number+" "+element.logo.id+" "+element.cover.id)   
    } 
}