2010-12-09 45 views
4

我试图将一个Grails应用程序与AS400/DB2数据库放在一起时遇到了问题。我无法获得大部分映射的文件,因为它们没有唯一的字段用作ID。即使他们确实是基于文本的字段,而不是可以转换为长类型的格式。 (我不明白为什么PK必须是一个很长的数据类型?如果你想给我们一个序列或人工智能的pk,这将是有道理的,但如果你只是需要一个独特的密钥?我在这里错过了什么?)使用Grails访问没有域类的数据库

我想知道是否可以保留我设置的数据源,并直接使用它直接访问数据库而不必使用域对象?

我见过的东西是将域对象设置为瞬态。但是我不知道你是否还可以做一些没有ID字段的事情。有人知道这是如何工作?

任何想法?

感谢, 乔恩

回答

3

你可以很容易地访问数据库,我们正在做在某些情况下,相同的性能方面的原因:

class SomeService { 
    def dataSource; 

    def nativeAccessMethod = { 
     def sql = new Sql(dataSource); 
     def rows = sql.rows("select * from myTable"); 
     /* processing continues ...*/ 
    } 
} 

Groovy的native SQL support也不错。

+0

这大部分工作。 dataSource返回null,所以我不得不使用def dataSource = AH.application.mainContext.dataSource来获取dataSource对象。 – jonsinfinity 2010-12-13 18:05:23

3

有没有要求,即一个主键是长的,它只是对Hibernate和Grails的标准。你可以把一个VARCHAR列这与域类这样的主键独特:

class Person { 

    String username 
    String firstName 
    String lastName 

    static mapping = { 
     id name: 'username', generator: 'assigned' 
     version false 
    } 
} 

这适用于本DDL定义的表:

create table person (
    username varchar(255) not null, 
    first_name varchar(255) not null, 
    last_name varchar(255) not null, 
    primary key (username) 
); 

我加了“版本错误”,因为这是一个遗留系统,你可能没有'版本'乐观锁定列。