我正在使用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
它可以保存数据库中的对象,但问题是什么 - 是否真的有必要为每个域类创建服务?我已经读过它建议将域逻辑放在服务中,我同意这一点,但是那个简单的域不需要任何逻辑呢?
我知道有很多问题,但我认为这些问题与其他问题相同,我真的想用Vaadin + Grails来享受两者的优点,但此刻对我来说并不容易!
答案 0 :(得分:0)
在我开始回答您的问题之前,让我质疑您的域名模型。基类通常很好,但我想谈谈人和客户。你可能有很好的理由为什么你选择继承,但请考虑组成。也许你可以拥有包含对枚举的引用的Person,它表示该人的类型。你可以从这里开始:http://en.wikipedia.org/wiki/Composition_over_inheritance
我觉得你有错字。在'customer'上调用save()方法而不是'Customer',这是一个类
当有请求进入Grails应用程序时,它会打开一个会话,并且会话在该请求期间可用。在Vaadin中没有这种行为。您需要将其放入服务中。是的,您可以制作通用服务来保存对象
class GenericService {def save(def domain){domain.save(failOnError:true)}}
您可以像这样获得会话工厂
导入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')
正如我所写,您可以为每个域对象创建GenericService或服务。请记住,GenericService应该只保存一个对象,而不包含特定于域对象的其他逻辑。