使用Vaadin 7 + Grails 2.3的基本问题(持久性,域类设计,获取Hibernate会话)

时间:2013-12-23 02:26:11

标签: grails vaadin

我正在使用Vaadin 7 + Grails 2.3,还有一些问题

我的域类

class Base {

private static final Date NULL_DATE = new Date(0)
Date createdAt  = NULL_DATE;
Date updatedAt  = NULL_DATE;

def beforeInsert(){
    createdAt = new Date();
    updatedAt = new Date();
}

def beforeUpdate(){
    updatedAt = new Date();
}

static mapping = {
    autoTimestamp true
 }
}


abstract class Person extends Base{ 

String name;
String name2;
String phone1;
String phone2;

static constraints = {
    name2 nullable:true
    phone1 nullable:true
    phone2 nullable:true            
}


}


class Customer extends Person {

double credit;

} 

问题


问题1

在我的Vaadin类UI中,如果我尝试这个

 class MyUI extends UI {

@Override
protected void init(VaadinRequest vaadinRequest) {

    Customer customer = new Customer()
    customer.name="RODRIGO"
    customer.save()
 }
}

显示此错误

Servlet [VaadinServlet 0]的Servlet.service()在路径[/ AgileWeb]的上下文中引发了异常[com.vaadin.server.ServiceException:groovy.lang.MissingPropertyException:没有这样的属性:类的名称:agileweb.Customer 可能的解决方案:全部]有根本原因 消息:没有此类属性:类的名称:agileweb.Customer 可能的解决方案:全部

没有“名字”属性? Customer类扩展了具有此属性的Person。


问题2

如果我试试这个

       Customer customer = new Customer()
   Customer.setName("RODRIGO")
   Customer.save()

显示错误:消息:没有Hibernate会话绑定到线程,并且配置不允许在此处创建非事务性

我已经了解了这个错误,但我不理解修复它,也许我是Grails的新手


问题3 - 实际上是一个问题

我知道我可以使用BeanItemContainer,只是来自List对象,这可能没有问题,但BeanItemContainer不是延迟加载,我想使用HbnContainer插件(https://vaadin.com/directory#addon/hbncontainer)因为它只需要一个hibernate session,那么如何才能获得“Hibernante会话”,有什么例子,怎么做?


问题4 - 实际上是一个问题(再次)

按照本教程https://vaadin.com/wiki/-/wiki/Main/Vaadin%20on%20Grails%20-%20Database%20access

它可以保存数据库中的对象,但问题是什么 - 是否真的有必要为每个域类创建服务?我已经读过它建议将域逻辑放在服务中,我同意这一点,但是那个简单的域不需要任何逻辑呢?

  • 那么,是否有可能为服务创建DAO之类的东西?是否存在任何服务设计以避免重复代码只是为了保存对象?

我知道有很多问题,但我认为这些问题与其他问题相同,我真的想用Vaadin + Grails来享受两者的优点,但此刻对我来说并不容易!

1 个答案:

答案 0 :(得分:0)

在我开始回答您的问题之前,让我质疑您的域名模型。基类通常很好,但我想谈谈人和客户。你可能有很好的理由为什么你选择继承,但请考虑组成。也许你可以拥有包含对枚举的引用的Person,它表示该人的类型。你可以从这里开始:http://en.wikipedia.org/wiki/Composition_over_inheritance

  1. 我觉得你有错字。在'customer'上调用save()方法而不是'Customer',这是一个类

  2. 当有请求进入Grails应用程序时,它会打开一个会话,并且会话在该请求期间可用。在Vaadin中没有这种行为。您需要将其放入服务中。是的,您可以制作通用服务来保存对象

    class GenericService {def save(def domain){domain.save(failOnError:true)}}

  3. 您可以像这样获得会话工厂

    导入org.codehaus.groovy.grails.commons.ApplicationHolder为AH

    def ctx = AH.application.mainContext def sessionFactory = ctx.sessionFactory

    或 ApplicationContext applicationContext = grailsApplication.mainContext ConfigurableLocalSessionFactoryBean factory = applicationContext.getBean('& sessionFactory')

  4. 正如我所写,您可以为每个域对象创建GenericService或服务。请记住,GenericService应该只保存一个对象,而不包含特定于域对象的其他逻辑。