| 

.NET C# Java Javascript Exception

composite-id in grails

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


composite-id in grails

thoser - 12.12.2007 09:37
hallo,

ich hab folgendes problem:
Aus einem bestehendem DB-Modell wurde mit Hilfe von Hibernate eine Klasse erstellt, die mehrere Schlüsselfelder enthält (Listing 1).
Ich habe auch den Controller (Listing2) und die GSP's(Listing3) erstellt. Die Daten aus der Datenbank werden auch dargestellt. Nur ist die Spalte id leer.
Wie schaffe ich es, das Datensätze editiert werden können?

Steffen

Ach ja: eine extra Spalte id und version in der DB sind nicht möglich und ich benutze java 6 und grails 1.0rc2


Listing 1:
import at.co.oegv.vbrm.cmp.KreditId;

class Kredit implements Serializable
{
KreditId id;
BigDecimal mandantId;
java.sql.Date stichtag;
String risikoArt;
String risikoSchl;

Long kundnr;
Long konzkopf;
String name2;
String strasse;
String nation;
.
.
.

static constraints=
{
mandantId(blank:false)
stichtag(blank:false)
risikoArt(blank:false)
risikoSchl(blank:false)
}

static indexes =
{
def mandantId
def stichtag
def risikoArt
def risikoSchl
}

static mapping =
{
table 'RM.KREDIT'
version false
id composite:['mandantId', 'stichtag', 'risikoArt', 'risikoSchl']
// id generator:'assigned'
columns {
basel2KundSeg column:'BASEL2_KUND_SEG'

}
}

}


Listing2:

class KreditController {

def index = { redirect(action:list,params:params) }

// the delete, save and update actions only accept POST requests
def allowedMethods = [delete:'POST', save:'POST', update:'POST']

def list = {
if(!params.max) params.max = 10
[ kreditList: Kredit.list( params ) ]

}

def show = {
[ kredit : Kredit.get( params.id ) ]
}

def delete = {
def kredit = Kredit.get( params.id )
if(kredit) {
kredit.delete()
flash.message = "Kredit ${params.id} deleted"
redirect(action:list)
}
else {
flash.message = "Kredit not found with id ${params.id}"
redirect(action:list)
}
}

def edit = {
def kredit = Kredit.get( params.id )

if(!kredit) {
flash.message = "Kredit not found with id ${params.id}"
redirect(action:list)
}
else {
return [ kredit : kredit ]
}
}

def update = {
def kredit = Kredit.get( params.id )
if(kredit) {
kredit.properties = params
if(!kredit.hasErrors() && kredit.save()) {
flash.message = "Kredit ${params.id} updated"
redirect(action:show,id:kredit.id)
}
else {
render(view:'edit',model:[kredit:kredit])
}
}
else {
flash.message = "Kredit not found with id ${params.id}"
redirect(action:edit,id:params.id)
}
}

def create = {
def kredit = new Kredit()
kredit.properties = params
return ['kredit':kredit]
}

def save = {
def kredit = new Kredit(params)
if(!kredit.hasErrors() && kredit.save()) {
flash.message = "Kredit ${kredit.id} created"
redirect(action:show,id:kredit.id)
}
else
{

render(view:'create',model:[kredit:kredit])
}
}


Listing3 (list.gsp):

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="layout" content="main" />
<title>Kredit List</title>
</head>
<body>
<div class="nav">
<span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
<span class="menuButton"><g:link class="create" action="create">New Kredit</g:link></span>
</div>
<div class="body">
<h1>Kredit List</h1>
<g:if test="${flash.message}">
<div class="message">${flash.message}</div>
</g:if>
<div class="list">
<table>
<thead>
<tr>

<g:sortableColumn property="id" title="Id" />

<g:sortableColumn property="mandantId" title="Mandant Id" />

<g:sortableColumn property="stichtag" title="Stichtag" />

<g:sortableColumn property="risikoArt" title="Risiko Art" />

<g:sortableColumn property="risikoSchl" title="Risiko Schl" />

<g:sortableColumn property="basel2KundSeg" title="Basel2 Kund Seg" />

</tr>
</thead>
<tbody>
<g:each in="${kreditList}" status="i" var="kredit">
<tr class="${(i % 2) == 0 ? 'odd' : 'even'}">

<td><g:link action="show" id="${id}">${kredit.id?.encodeAsHTML()}</g:link></td>

<td>${kredit.mandantId?.encodeAsHTML()}</td>

<td>${kredit.stichtag?.encodeAsHTML()}</td>

<td>${kredit.risikoArt?.encodeAsHTML()}</td>

<td>${kredit.risikoSchl?.encodeAsHTML()}</td>

<td>${kredit.basel2KundSeg?.encodeAsHTML()}</td>

</tr>
</g:each>
</tbody>
</table>
</div>
<div class="paginateButtons">
<g:paginate total="${Kredit.count()}" />
</div>
</div>
</body>
</html>


Re: composite-id in grails

christian - 13.12.2007 13:20
Hallo thoser,

wenn ich das richtig verstehe, funktionieren die DB-Operationen nur in der Anzeige in der Grails-Anwendung wird keine ID ausgegeben. Vielleicht hilft es, wenn du in die Klasse Kredit eine get-Methode einbaust, die einen String zurückliefert, der dann auch ausgegeben werden kann. Schreib mal, falls das funktioniert (würde mich auch interessieren).

Gruß
Christian


Re: composite-id in grails (solved)

milkyman - 29.03.2008 15:21
Hallo thoser,

bitte nochmal langsam zum mitschreiben. ;-)

Ich bin mit Hilfe deiner Beiträge jetzt soweit, dass das Mapping in Hibernate und Grails ok zu sein scheint. Nun wird mir aber in der ID Spalte nicht mehr wie vorher die Objekt-ID der Composite-ID Klasse angezeigt (weil die ja nicht mehr verwendet wird), sondern stattdessen bleibt die ID Spalte leer. D.h. an dieser Stelle fehlt der Link zum bearbeiten eines Objektes.
CreateNew geht erstmal noch und ich kann auch alle notwendigen Werte eingeben. Nach Klick auf Create-Button bekomme ich dann aber einen NullPointer bei
def right = Right.get( params.id )
Es handelt sich wahrscheinlich um den gleichen Fehler, den du auch beschreibst. Anzeigen/Editieren eines Einzelobjekts geht ebenfalls nicht.
Dein
Zitat
thoser
Nun im Controller "def kredit = Kredit.get(new Kredit(mandantId='ü'..."
und statt params nun 'kredit' verwenden und voila, et löwt ;)
verstehe ich leider nicht ganz. Wo muss das eingefügt werden und vor allem was verwendest du bei den Werten wie mandantID='ü'? Woher weißt du, dass das konkrete Objekt die mandantId "ü" hat?

Vielleicht kannst du das nochmal etwas ergänzen oder idealerweise den überarbeiteten Code zur Verfügung stellen.

Besten Dank im voraus!
Horst


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "composite-id in grails" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.