Попытка использовать класс домена Grails из оболочки - PullRequest
2 голосов
/ 02 марта 2010

Я новичок в Grails.

Я пытаюсь поэкспериментировать с моими доменами grails из оболочки, и я не могу заставить его работать. Эти домены отлично работают из кода скаффолда, когда я запускаю приложение.

Учитывая этот класс домена

class IncomingCall {

    String caller_id
    Date call_time
    int  call_length

    static constraints = {
    }
}

Я пытаюсь создать IncomingCall и сохранить его из оболочки. Независимо от того, что я делаю, я всегда получаю «Нуль»; объект не создан

И если я пытаюсь создать объект, а затем выполнить сохранение, я получаю сообщение об ошибке «Сеанс гибернации не связан с потоком» (см. Ниже).

groovy:000> new IncomingCall(caller_id:'555-1212', call_time: new Date(), call_length:10).save()
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
        at org.springframework.orm.hibernate3.SpringSessionContext.currentSession (SpringSessionContext.java:63)
        at org.hibernate.impl.SessionFactoryImpl.getCurrentSession (SessionFactoryImpl.java:574)
        at groovysh_evaluate.run (groovysh_evaluate:3)
    ...
groovy:000> 

Как я могу заставить это работать из оболочки?

Ответы [ 2 ]

0 голосов
/ 03 марта 2010

Я тоже столкнулся с этой очень раздражающей проблемой.

Чтобы исправить это, запустите этот код в оболочке, чтобы привязать сеанс гибернации к менеджеру синхронизации транзакций:

import org.hibernate.Session
import org.hibernate.SessionFactory
import org.springframework.orm.hibernate3.SessionFactoryUtils
import org.springframework.orm.hibernate3.SessionHolder
import org.springframework.transaction.support.TransactionSynchronizationManager
sessionFactory = ctx.getBean("sessionFactory")
session = SessionFactoryUtils.getSession(sessionFactory, true)
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session))

После этого доменные объекты должны работать как положено.

0 голосов
/ 02 марта 2010

Я обнаружил, что использование классов домена Grails из оболочки обычно не работает должным образом. Одна вещь, на которую я обращаю внимание - это то, что у вас нет операторов импорта. Если ваши классы находятся в пакете com.my.domain, прежде чем пытаться создать экземпляр класса, вам нужно сделать

import com.my.domain.*
...