tutorial play framework scala playframework ebean

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.