Príklad aplikácie: https://github.com/Hi-Fi/writetable-example-with-grails
V príkladovej aplikácii pracujú správne pri používaní stránok GSP alebo pri účtovaní formulára CURL. Príkaz s oblúkom:
curl "http://localhost:8080/junk/team/save" --data "name=team&players"%"5B0"%"5D.firstName=first&players"%"5B0"%"5D.lastName=last&players"%"5B0"%"5D.position=position&create=Create" --compressed.
Problém je s rovnakou požiadavkou pomocou JSON, ktorý vytvára identický objekt (podľa dump ()), ale nemôže uložiť vnorené hodnoty.
Pri vytváraní POST s SOAPUI (localhost: 8080 / junk / api / rest):
{
name: "Team name",
players: [
{
firstName: "Player first name",
lastName: "Player last name",
position: "Player position"
}
]
}
Chyba som len:
| Error 2014-12-20 21:02:47,050 [http-bio-8080-exec-1] ERROR hibernate.AssertionFailure - an assertion failure occured
(this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
Message: null id in junk.Player entry (don"t flush the Session after an exception occurs)
Line | Method
->> 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 744 | run . . . in java.lang.Thread
Rodičovský objekt (tím) je stále uložený, aj keď je táto chyba. Keď je Hibernate4 úplne uloľená, tak aktualizácia na ňu nepomáhala.
odpovede:
0 pre odpoveď č. 1Jedným zo spôsobov, ako to vyriešiť, je explicitne spojiť "Team" s každým "Hráčom"
team.players.each {it.team = team}
Pri odosielaní formulára sa tento krok vykoná automaticky, ale z nejakého dôvodu nie s JSON. Objekt hráča na vytvorení vytvorenia tímu v JSON:
<junk.Player@76f8539e firstName=first lastName=last position=position deleted=false errors=grails.validation.ValidationErrors: 0 errors $changedProperties=null id=null version=null team=null>
A s formou POST:
<junk.Player@1ba14c1b firstName=first lastName=last position=position deleted=false errors=grails.validation.ValidationErrors: 0 errors $changedProperties=null id=null version=null team=junk.Team : (unsaved)>
Toto pravdepodobne nie je "správne" riešenie, takže som stále šťastná, že počujem, či je lepšie riešenie pre vnorené one-to-many-listy.