java - Grails/GORM 2.3 Hibernate 寻找抽象域类持久化表

标签 java hibernate grails groovy grails-orm

我是 Grails 和 GORM 的新手,但我在旧版 PostgreSQL 上有一个旧的 JPA2(Hibernate)应用程序要映射,但我无法让抽象类的继承工作,这是一个问题的示例,让我们使用这个表:

users (id serial, username varchar, password char(44), user_modified integer, last_modified timestamp);
roles (id serial, role varchar, description varchar, enabled boolean, user_modified integer, last_modified timestamp);
permissions (user_id integer, role_id integer, enabled boolean);

正如您所看到的,这些表使用数字自动递增 id,但并非所有表都如此,在旧的 JPA 映射上,我使用 @MappedSuperclass 来映射 ID 配置,例如作为 id 生成器和一些审计列:

@MappedSuperclass
public abstract class DefId {
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;

    @NotNull 
    @Column(name = "user_modified")
    protected Long userModified;

    @Version 
    @Column(name = "last_modified") 
    @Source(SourceType.DB)
    protected Date lastModified;

    //getters and setters
}

这是我迄今为止在 grails 中尝试过的:

DefId.groovy:

abstract class DefId {
    /*In the actual source this are protected fields
    with public getters/setters removed for less code*/
    Long id; 
    Long userModified;
    Timestamp version;

    static mapping = {
        id generator: 'identity'
        version 'last_modified'
        userModified column: 'user_modified'
    }
}

User.groovy:

package maptest.domain

import maptest.model.DefId

class User extends DefId {
    String username
    String password
    boolean enabled
    static hasMany = [roles: Role];

    static mapping = {
        table name: "users", schema: "core"
        roles joinTable: [name: "permissions", key: "user_id"]
    }

    static constraints = {
        username blank: false, size: 2..20, matches: "^[A-Za-z]\\w+\$", unique: true
        password blank: false, matches: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?\$"
        preferences unique: true
    }
}

角色.groovy

package maptest.domain

import maptest.domain.DefId

class Role extends DefId{
    String role
    String description
    boolean enabled

    static hasMany = [users: User];
    static belongsTo = [User];

    static mapping = {
        table name: "roles", schema: "core"
        users joinTable: [name: "permissions", key: "role_id"]
    }
    static constraints = {
        role blank: false, size: 2..20, matches: "^[A-Za-z]\\w+\$", unique: true
        description   size: 2..50
    }
}

如果我将抽象类保留在域结构中,则会出现异常:org.springframework.jdbc.BadSqlGrammarException:Hibernate操作:错误:关系“def_id”不存在;这是真的,但我并不想保留抽象类。

如果我更改包并将抽象类移动到 src/groovy 然后我得到:org.springframework.orm.hibernate4.HibernateSystemException: UnknownEntity: mapetest.domain.User;

我还尝试将 grails.gorm.default.mapping = { id Generator: 'identity' } 添加到 Config.groovy 并从父类(super class)中删除 id 字段,但这只能让我成功另一个错误:加载插件管理器时出错:找不到身份属性,但在域类 [maptest.domain.Role] 中需要该属性

有人有什么想法吗?将id生成器:​​'identity''添加到每个域类中可以解决这个问题,但这违背了继承的目的。

请原谅我的英语,这是第二语言

最佳答案

将抽象类放入域类文件夹中。您还需要告诉 Grails 考虑每个类使用不同的表:

static mapping = {
  tablePerSubclass true
}

默认情况下只有一个带有 class 列的表。

您也不需要声明 id 字段,因为它是由 Grails 自动生成的,类型为 Long

关于java - Grails/GORM 2.3 Hibernate 寻找抽象域类持久化表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19587479/

相关文章:

java - Kafka 0.11 中 sendOffsetsToTransaction 的含义

java - Cometd 服务器广播 channel 自动删除

java - 带有 withClause 参数的 Hibernate createAlias() 会导致惰性收集

java - 使用 jQuery .Post 将 UTF-8 作为文本渲染到模态框

grails - 如何将 Grails 插件添加到 IntellIJ?

java - Jsoup选择器: 2nd div after h2

java - Netbeans JNLP Webstart 错误

java - 从4.3.11.Final版本切换到5.0.1.Final导致编译报错

java - JPA 中实体列表的搜索和排序问题

java - Grails - 在 CLASSPATH 中找不到类 "org.grails.tomcat.TomcatLoader"