0

我开始大量使用 groovy 来制作所有东西的原型。这真太了不起了。
但是我遇到了 groovy shell 的问题。
我运行的下一个代码

groovy filename.groovy

一切都按预期工作。
但在groovysh指挥之下

load filename.groovy

不起作用:它找不到类 Book。

编码:

import org.hibernate.cfg.*
import org.hibernate.ejb.*
import javax.persistence.*

@Entity class Book {
    @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long id
    public String author
    public String title
    String toString() { "$title by $author" }
}

hibernateProperties = [
    "hibernate.dialect": "org.hibernate.dialect.HSQLDialect",
    "hibernate.connection.driver_class": "org.hsqldb.jdbcDriver",
    "hibernate.connection.url": "jdbc:hsqldb:mem:demodb",
    "hibernate.connection.username": "sa",
    "hibernate.connection.password": "",
    "hibernate.connection.pool_size": "1",
    "hibernate.connection.autocommit": "true",
    "hibernate.cache.provider_class": "org.hibernate.cache.NoCacheProvider",
    "hibernate.hbm2ddl.auto": "create-drop",
    "hibernate.show_sql": "true",
    "hibernate.transaction.factory_class": "org.hibernate.transaction.JDBCTransactionFactory",
    "hibernate.current_session_context_class": "thread"
]

properties = new Properties()
hibernateProperties.each { k, v -> properties.setProperty(k, v) }
cfg = new Ejb3Configuration()

emf = cfg.addProperties(properties).addAnnotatedClass(Book.class).buildEntityManagerFactory()
em = emf.createEntityManager()
query = em.createQuery("SELECT b FROM Book b")

println query.getResultList()

事实上,如果你把Book类写成

@Entity 
class Book {
    @Id @GeneratedValue(strategy = GenerationType.AUTO) 
    public Long id
    public String author
    public String title
    String toString() { "$title by $author" }
}

执行时 Groovy Shell 无法理解注释

load filename.groovy

因此,要使用 JPQL,我必须将 Entity 移动到单独的文件中,对其进行 groovyc 处理,然后加载 groovy shell。不是最坏的情况,但如果我可以将原型加载到外壳中,那就太好了。

你有什么想法如何解决这个问题吗?

4

1 回答 1

0

简短的回答是我认为没有办法解决这个问题。如果您要重用 Book 类而不经常更改它,您总是可以编译一次,然后将其添加到您的类路径中,这样 Groovy 会在您每次使用 shell 时选择它。

于 2009-08-28T21:08:11.457 回答