Ho un tavolo user_permissions
che dispone di 46 colonne di autorizzazione insieme a id
e created_date
. Questo tavolo ha un corrispondente UserPermissions
classe:Slick - Aggiorna oggetto completo o più di 22 colonne
class UserPermission(val id: Long,
val createdDate: Option[Timestamp],
val permission1: Boolean,
val permission2: Boolean,
...
val permission46: Boolean)
e tabella di mappatura chiazza di petrolio
class UserPermissions(tag: Tag) extends Table[UserPermission](tag, "users_permissions") {
def * = (
id ::
createdDate ::
permission1 ::
permission2 ::
...
permission46 ::
HNil).shaped <> (
{ case x => UserPermission(
x(0), x(1), x(2), ... x(47))
},
{
UserPermission.unapply _
}
}
... <columns defined here>
)
Ora voglio aggiornare insieme UserPermission che viene identificato da id
. La funzione che ho è:
object UserPermissions {
val userPermissions = TableQuery[UserPermissions]
def update(userPermission: UserPermission)(implicit session: Session) = {
userPermissions.filter(_.id === userPermission.id.get).update(userPermission)
}
}
questo non sta funzionando e gettando Eccezione:
play.api.Application$$anon$1: Execution exception[[SQLServerException: Cannot update identity column 'id'.]]
che ha senso come l'SQL generato da Slick è:
update "users_permissions" set "id" = ?, "created_date" = ?, ...
Problema 1 Quindi il mio primo problema è che non riesco ad aggiornare un intero oggetto UserPermission
con chiazza di petrolio. Se ho una soluzione a questo problema, sarebbe fantastico.
Dal momento che sono in grado di aggiornare piena oggetto poi ho pensato a yield
le colonne che voglio aggiornare poi sparare una query di aggiornamento. Il codice è simile al seguente:
def update(obj: UserPermission)(implicit session: Session) = {
val query = for {
p <- userPermissions
if p.id === obj.id.get
} yield (p.permission1, p.permission2, ... p.permission46)
query.update(obj.permission1, obj.permission2, ... obj.permission46)
}
Problema 2 Ora chiazza di petrolio non è l'aggiornamento di 46 colonne in query.update()
funzione. Può gestire solo 22 colonne alla volta. Come posso aggiornare il mio oggetto UserPermissions
?
Una soluzione errata che posso pensare è di aggiornare 22 prima volta, poi 22 secondi, poi 2 nella terza query. Saranno 3 query di aggiornamento db che non voglio.
Qualche soluzione al mio problema?
dipendenze sono:
scalaVersion := "2.11.4"
"com.typesafe.play" %% "play-slick" % "0.8.1"
"com.typesafe.slick" %% "slick-extensions" % "2.1.0"
Grazie per aver fornito suggerimenti. Li ho già presi in considerazione prima di postare ma non riesco ad implementare nessuno di questi. Poiché l'aggiornamento di 'play' e' slick' fa parte degli sprint futuri e il layout della tabella non può essere modificato come nei suoi sistemi di produzione e molte applicazioni sono strettamente accoppiate all'attuale design della tabella in modo che ne risentano tutti. –