0

私は 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 を使用していますが、すべてのテーブルに当てはまるわけではありません@MappedSuperclass。ID ジェネレーターやいくつかの監査列などの ID 構成をマップするために使用した古い JPA マッピングでは、次のようになります。

@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'
    }
}

ユーザー.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
    }
}

Role.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 operation: ERROR: relation "def_id" don't exists;それは本当ですが、抽象クラスを永続化しようとしていません。

パッケージを変更して抽象クラスを src/groovy に移動すると、次のようになります。org.springframework.orm.hibernate4.HibernateSystemException: Unknown entity: mapetest.domain.User;

また、grails.gorm.default.mapping = { id generator: 'identity' }を Config.groovy に追加して、スーパークラスから id フィールドを削除しようとしましたが、別のエラーが発生するだけでした:Error loading plugin manager: Identity property not found, but required in domain class [maptest.domain.Role]

誰でも何か考えがありますか?id generator: 'identity' ´ をすべてのドメイン クラスに追加すると解決しますが、継承の目的が無効になります。

すみません、英語は第二言語です

4

1 に答える 1