【问题标题】:Basic problems to use Vaadin 7 + Grails 2.3 (Persistence, domain class design, get Hibernate Session)使用 Vaadin 7 + Grails 2.3 的基本问题(持久化、领域类设计、获取 Hibernate Session)
【发布时间】:2013-12-23 02:26:10
【问题描述】:

我正在使用 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] 在路径 [/AgileWeb] 的上下文中的 Servlet.service() 引发异常 [com.vaadin.server.ServiceException: groovy.lang.MissingPropertyException: 没有这样的属性:类的名称:agileweb.Customer 可能的解决方案:全部] 有根本原因 消息:没有此类属性:类名称:agileweb.Customer 可能的解决方案:全部

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


问题 2

如果我试试这个

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

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

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


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

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


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

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

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

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

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

【问题讨论】:

  • 我计划在 vaadin.com 上发布更多教程。这些问题将有助于选择主题。谢谢。

标签: grails vaadin


【解决方案1】:

在我开始回答你的问题之前,让我问你领域模型。基类一般都很好,但我想谈谈 Person 和 Customer。您可能有充分的理由选择继承,但请考虑组合。也许你可以拥有一个包含对枚举的引用的 Person,它说明了这个人的类型。你可以从这里开始:http://en.wikipedia.org/wiki/Composition_over_inheritance

  1. 我认为你有一个错字。在“客户”而不是“客户”上调用 save() 方法,这是一个类

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

    类 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 应该只保存一个对象,并且不包含特定于域对象的其他逻辑。

【讨论】:

  • 非常感谢您的回复。你说的“组合优于继承”很有趣,我会更好地检查它。祝贺并感谢 vaalinonrails 网站
猜你喜欢
  • 2013-11-04
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 2013-01-06
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
相关资源
最近更新 更多