Newsgroup: it.comp.java
Titolo: grails.

Salve.
Provengo da ruby on rails ma in azienda vogliono che lo sviluppo si 
incentri su java.
Sto cercando di imparare struts2 ma.....qualcuno conosce e usa grails?
Opinioni?
Presumo che nessuno qui si sia cimentato con rails, mi sarebbe piaciuto 
avere un parere su entrambi.

 avere un parere su entrambi.
Uso ruby e rails (anche se come linguaggio preferisco python) e ho 
provato in modo piuttosto esaustivo grails.
Anche se i due framework sono nati con una comune idea di fondo 
(realizzare applicazioni web in modo rapido grazie ad un forte uso di 
convenzioni) hanno delle differenze non da poco, dovute sostanzialmente 
alla natura del linguaggio che usano:
rails è scritto in un linguaggio a tipizzazione dinamica completamente 
ad oggetti, grails è scritto in groovy che a sua volta è implementato in 
java, a tipizzazione (sostanzialmente) statica e più class oriented che 
object oriented (alcune importanti componenti del linguaggio non sono 
oggetti ma "esistono" solo in funzione delle classi di appartenenza, es. 
metodi e package).
Oltre a questa differenza di fondo rails è pensato per funzionare 
"standalone" mentre grails viene usato in un apposito container (es. 
tomcat) e utilizza varie librerie di supporto (standard o esterne, 
soprattutto JDBC, Ant, Spring, Hibernate), per cui è necessario avere 
delle ulteriori competenze se si vuol realizzare qualcosa di "serio".
Grails dalla sua parte ha prestazioni decisamente più performanti (in 
rete trovi decine di benchmarks di vario tipo) e la possibilità di usare 
tutte le migliaia di librerie che esistono per java, mentre rails è un 
po' più una "scatola chiusa"...
In conclusione IMHO la somiglianza è solo "filosofica", in realtà rails 
è rivolto (utile) soprattutto a piccoli team di sviluppatori mentre 
grails è pensato per integrarsi in contesti applicativi molto più 
estesi, sia come funzionalità che come numero di sviluppatori, basati su 
J2EE [1].
Sinceramente se sei abituato con ruby sarà arduo passare a java, non 
tanto per il linguaggio in sé, che pure ha dei vincoli molto più rigidi 
rispetto a ruby (vincoli che possono essere considerati sia positivi che 
negativi, dipende dalle circostanze), quanto per tutto l'ambiente di 
sviluppo che sotto molti aspetti, come già ha fatto notare Marco, è 
fortemente sovra-ingegnerizzato.
Per darti un consiglio concreto bisognerebbe capire meglio che tipo di 
progetti devi realizzare ma, visto che ben capisco le "incompetenti 
ingerenze dirigenziali" ;) mi permetto di suggerirti di dare un'occhiata 
a JRuby:
permette di usare gem e rails [2] e potresti quindi partire da un 
ambiente in java (e accontentare i dirigenti) per poi usare uno 
strumento più familiare [3].
Spero di averti dato qualche indicazione utile.
Ciao.
[1] lo si nota chiaramente confrontando dimensioni e tipo dei progetti 
"di successo":
http://rubyonrails.org/applications
http://www.grails.org/Success+Stories
[2] 
http://wiki.jruby.org/wiki/Main_Page
[3] senza contare che JRuby è della Sun e l'ipotesi di includerlo nel 
JDK non è nuova... 
(
http://java.sun.com/developer/technicalArticles/scripting/jruby/
)

 in modo piuttosto esaustivo grails.
Salse, mi sto anch'io approciando a grails, visto che hai provato in modo 
piuttosto esaustivo, ti chiedo un aiuto.
Grails vuole in ogni tabelle il campo id come faccio io a cambiare questo 
comportamento ( ho gia le tabelle  con chiave es. CODICE non ID)?
Grazie 

 comportamento ( ho gia le tabelle  con chiave es. CODICE non ID)?
E' un inconveniente che ho riscontrato anch'io (versione 1.0.x, non la 
più recente 1.1).
La soluzione ufficiale è questa: 
www.grails.org/GORM+-+Mapping+DSL
 
(paragrafo: /Customising the id generation strategy/ e seguente) però 
sottolineo che testando numerose volte questo tipo di mappatura (sia il 
generator che, soprattutto, il composite) ho riscontrato alcuni 
problemi: talvolta veniva comunque creato il campo id in tabella (anche 
se non sempre usato), altre volte mappava un campo corretto ma ne usava 
un altro, altre ancora provocava conflitti con campi autoincrementali, a 
volte funzionava.
Il tutto senza modificare il codice dell'oggetto, solo forzandone la 
ricompilazione automatica (e conseguente ALTER sulla tabella mappata) 
con modifiche minori al sorgente.
La soluzione "base" (id column:'CODICE') invece non mi ha creato 
particolari problemi.
N.B.: attenzione solo che il campo che si vuol usare come indice sia di 
tipo Long.

 tipo Long.
Perche' deve essere long?

 Perche' deve essere long?
Di default usa il Long (come ActiveRecord usa un intero per l'id) che 
equivale al long di java, poi usando /generator/ o /composite/ si 
possono mappare altri campi (uno o più, di diverso tipo) sull'id.

 [...] usando /generator/ o /composite/ si possono mappare [...]
Non ho detto che si può anche forzare il tipo di dato dell'id, usando 
"type" seguito dal tipo di dato (standard o custom), es. "id type: 
'string'"/.
Però ho notato che non con tutti i db il comportamento è "lineare": a 
volte usando un tipo di dato con range più ampio crea un campo dello 
stesso tipo o anche minore (problema che ho riscontrato soprattutto con 
MySql, stranamente... ;) ).

 particolari problemi.
class Enti {
    Long cod_ente
    String ente
    static mapping = {
        table 'enti'
       version false
      columns {
         id column:'cod_ente'
      }
  }
}
quando riavvio il server jetty, mi da questo prob:
org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'messageSource': Initialization of bean failed; nested exception 
is org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'transactionManager': Cannot resolve reference to bean 
'sessionFactory' while setting bean property 'sessionFactory'; nested 
exception is org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name 'sessionFactory': Invocation of init method failed; 
nested exception is org.hibernate.MappingException: Repeated column in 
mapping for entity: Enti column: cod_ente (should be mapped with 
insert="false" update="false")
perche?
ti chiedo un'altro aiuto, per formattare le date in italiano come posso fare 
in un modo veloce?
Cosa mi consigli passo alla nuova versione 1.1?
Grazie

 Cosa mi consigli passo alla nuova versione 1.1?
E' uscita proprio in questi giorni...
Per tenere un "margine di sicurezza" prima di usare una nuova versione 
in ambienti di produzione personalmente aspetto sempre almeno un mesetto 
(anche due).
Se invece ti interessa per motivi di studio/prova o comunque la messa in 
produzione non è prossima forse ti conviene, visto che le novità non 
sono poche. Magari non radicali ma certo utili, come ad es. la 
possibilità di usare custom tag jsp standard, per il problema di 
formattazione date di cui parlavamo.
Buon lavoro! :)

 equivale al long di java, 
Quindi se volessi usare lo stesso database e le stesse tabelle, create 
per un progetto Rails, in grails il passaggio non e' indolore.

 per un progetto Rails, in grails il passaggio non e' indolore.
Migrazioni di questa portata non sono mai indolori, diciamo che i dolori 
in linea di massima dovrebbero essere contenuti e ben circostanziati ;)
Forzando adeguatamente il tipo il problema si aggira con una riga di codice.
Tra l'altro non vorrei dire una castronata ma mi sembra di ricordare 
(ora purtroppo non ho tempo di verificare) che se grails trova già un 
campo id con datatype "compatibile" (sostanzialmente un intero, anche se 
di dimensione diversa da quella di default) lo utilizza senza problemi 
(o, al limite, effettua un ALTER TABLE "lossless").

 (anche due).
anch'io la penso cosi, meglio 3 :-)
Ho trovato un'altro comportamento strano, ho una tabella di  10 campi  creo 
la domain class  con 10 campi faccio generate all lui mi crea list con sono 
5 campi, ho dovuto scrivere a mano i restanti campi, perche?
grazie
luca 

 5 campi, ho dovuto scrivere a mano i restanti campi, perche?
Bella domanda... senza almeno una bozza di codice ci vorrebbe la sfera 
di cristallo ;)

> Ma la tabella č relazionata ad altre? Se sě, in che modo?
no senza nulla, semplice tab di  n campi senza join,  mi viene un dubbio: 
ORACLE impossibile che dici...
bye 

 "impalla" hibernate.
Dopo un giorno di incazzature qualcosa va, era vie.campo:
    static mapping = {
        table 'vie'
      version false
       columns {
      id column:'vie.cod_via'
       }
pero in vi/list.gjp trovo sempre il campo id cosi  mi dice giustamente 
ORA-00904: nome di colonna non valido
Perche?
grazie
luca 

 Perche?
Bella domanda... con così poche informazioni servirebbe la sfera di 
cristallo ;)

 cristallo ;)
Allora, la mia domain classes vie.groovy:
class Vie {
Long cod_via
String desc_via
    static mapping = {
      version false
      columns {
      id column:'vie.cod_via'
      }
  }
}:
Faccio generate all, mi aspetterei che il campo id sia customizzato in 
cod_via e invece lui usa ancora il campo id in list.gsp cosi mi dice 
giustamente ORA-00904: nome di colonna non valido:
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <meta name="layout" content="main" />
        <title>Vie 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 Vie</g:link></span>
        </div>
        <div class="body">
            <h1>Vie 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="cod_via" 
title="Codvia" />
                            <g:sortableColumn property="desc_via" 
title="Descvia" />
                        </tr>
                    </thead>
                    <tbody>
                    <g:each in="${vieInstanceList}" status="i" 
var="vieInstance">
                        <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
                            <td><g:link action="show" 
id="${vieInstance.id}">${fieldValue(bean:vieInstance, 
field:'id')}</g:link></td>
                            <td>${fieldValue(bean:vieInstance, 
field:'cod_via')}</td>
                            <td>${fieldValue(bean:vieInstance, 
field:'desc_via')}</td>
                        </tr>
                    </g:each>
                    </tbody>
                </table>
            </div>
            <div class="paginateButtons">
                <g:paginate total="${Vie.count()}" />
            </div>
        </div>
    </body>
</html>
Grazie 

 Faccio generate all [...]
A questo punto che struttura della tabella ti trovi, sul DB?

> A questo punto che struttura della tabella ti trovi, sul DB?
      Name
     Schema
     Datatype
     Size
      COD_VIA
     NUMBER
     5
      DESC_VIA
     VARCHAR2
     30
      NOME_CORTO
     VARCHAR2
     30
      ZONA
     NUMBER
     2
      TIPO_VIA
     VARCHAR2
     20
      NOME_CORTO2
     VARCHAR2
     30
mistero....... 

> A questo punto che struttura della tabella ti trovi, sul DB?
      COD_VIA     NUMBER     5


 mistero.......
Continuo ad avere perplessità sull'istruzione:
id column:'vie.cod_via'
IMHO quel "vie" è di troppo.
Un suggerimento (ovviamente da verificare): cod_via è diverso da 
COD_VIA, attenzione che non sia un "banale" errore di sintassi.
Errori simili li ho visti con hibernate e visto che grails lo usa...

 Errori simili li ho visti con hibernate e visto che grails lo usa...
Lasciamo perdere questo mistero....... uso il suo id
Ho un'altro problema richiamare una store procedure io tipicamente faccio 
SELECT PROT_GEN(:anno) INTO :PROT_GEN FROM DUAL;
se faccio cosi in gral hidernate mi da dual non mappato perche?
Grazie