ken*_*ken 15 grails grails-orm
在Grails中,有没有办法限制枚举枚举的列的大小.在以下示例中,我希望列类型为char(2)
enum FooStatus {
BAR('br'), TAR('tr')
final static String id
}
class Foo {
FooStatus status
static constraints = {
status(inList:FooStatus.values()*.id,size:2..2)
}
}
Run Code Online (Sandbox Code Playgroud)
在导出模式时,inList和size都没有任何效果,列类型保持其默认值(varch(255))如果我定义一个新的UserType,也许我可以这样做.任何的想法 ?
谢谢你
Bur*_*ith 20
鉴于枚举在GORM中内部映射的方式,我认为这不可能直接实现.但是将代码更改为:
enum FooStatus {
BAR('br'),
TAR('tr')
private FooStatus(String id) { this.id = id }
final String id
static FooStatus byId(String id) {
values().find { it.id == id }
}
}
Run Code Online (Sandbox Code Playgroud)
和
class Foo {
String status
FooStatus getFooStatus() { status ? FooStatus.byId(status) : null }
void setFooStatus(FooStatus fooStatus) { status = fooStatus.id }
static transients = ['fooStatus']
static constraints = {
status inList: FooStatus.values()*.id
}
static mapping = {
status sqlType: 'char(2)'
}
}
Run Code Online (Sandbox Code Playgroud)
添加瞬态getter和setter允许您设置或获取String(id)或enum值.
Dav*_*ker 11
Grails附带一个未记录的(据我无论如何)自定义Hibernate映射的枚举.该类是org.codehaus.groovy.grails.orm.hibernate.cfg.IdentityEnumType.它不会让您设置列大小,但可以轻松更改每个枚举值在DB中存储的内容,而无需向模型添加瞬态字段.
import org.codehaus.groovy.grails.orm.hibernate.cfg.IdentityEnumType
class MyDomainClass {
Status status
static mapping = {
status(type: IdentityEnumType)
}
enum Status {
FOO("F"), BAR("B")
String id
Status(String id) { this.id = id }
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在Bootstrap.groovy中运行"alter table"来缩小列:
DataSource dataSource
...
Sql sql = new Sql(dataSource)
sql.execute("alter table my_domain_class change column status status varchar(1) not null")
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22598 次 |
最近记录: |