scala - play - Ebean: Cascade con OneToOne-intenta inserciones en lugar de actualizar
play framework postgresql (0)
Estoy usando Scala con Ebean, y me he encontrado con serios problemas. La situación es bastante simple, tengo una entidad matriz:
@Entity
case class Person(@(PrivateOwned@field)
@(OneToOne@field)(fetch = FetchType.LAZY, cascade = Array(CascadeType.ALL), orphanRemoval = true)
@(JoinColumn@field)(name = "website_setting_id")
websiteSetting: WebsiteSetting,
@(Id@field)id: Long = 0) extends Model
donde WebsiteSetting
es:
@Entity
case class WebsiteSetting(@(Column@field)(unique = true) domain: String,
planId: Long,
@(Id@field) id: Long = 0) extends Model
Lo que estoy viendo es que cuando hago algo como:
val ws = WebsiteSetting("somedomain.com", 1)
val p = Person(ws)
p.save() // works as expected
Pero el siguiente falla,
val updated = p.copy(websiteSetting = p.websiteSetting.copy(planId = 2))
updated.update()
con:
javax.persistence.PersistenceException: ERROR executing DML bindLog[]
error[Duplicate entry ''167'' for key ''PRIMARY'']
Lo que significa claramente que Ebean no sabe que la entidad hija necesita una actualización e intenta hacer una inserción con ella, sin tener en cuenta el campo id, que equivale a 167
.
¿Cuál es la mejor manera de evitar este problema?
Editar: versión del complemento Ebean: https://www.playframework.com/documentation/2.3.6/api/java/play/db/ebean/package-summary.html (he usado el complemento ebean que se envió con Play 2.3.6)
Excepción: la excepción surge cuando Ebean intenta hacer una inserción de una instancia con una ID existente. He visto en los registros de SQL que la declaración que Ebean intenta ejecutar en el servidor es una insert
con id
= 167, que es una fila existente en la tabla. Esto resulta en la excepción.