かとじゅんの技術日誌

技術の話をするところ

関連プロパティの名前をカスタマイズしたい

現行版のs2jdbc-genでは以下のようにuser_idを参照している箇所が複数あると,エンティティ名+連番のプロパティ名が割り当てられます.

    /** createUser関連プロパティ */
    @ManyToOne
    @JoinColumn(name = "create_user_id", referencedColumnName = "user_id")
    public User user1;

    /** updateUser関連プロパティ */
    @ManyToOne
    @JoinColumn(name = "update_user_id", referencedColumnName = "user_id")
    public User user2;

で,これをこのようにしてみたい.

    /** createUser関連プロパティ */
    @ManyToOne
    @JoinColumn(name = "create_user_id", referencedColumnName = "user_id")
    public User createUser;

    /** updateUser関連プロパティ */
    @ManyToOne
    @JoinColumn(name = "update_user_id", referencedColumnName = "user_id")
    public User updateUser;

OSSなんだから他力本願ではなく自力本願指向ということでw,ソースを読んで自分でカスタマイズしてみようということで,中村さんの書いてるソースを拝見.fmfm.

んで,いろいろ見ていたらできました.かなり強引なロジックというか俺流なんでご容赦をw
AssociationResolverクラスの以下のメソッドを置き換えると下記のようになります.自分のテーブルの外部キーのカラム名からIDやCODEのサフィックスを削除した名前をプロパティ名に採用するようなロジックになっています.

 /**
     * 関連名を返します。
     * 
     * @param fkMeta
     * 
     * @param referencingEntityDesc
     *            参照する側のエンティティ記述
     * @param referencedEntityDesc
     *            参照される側のエンティティ記述
     * @param oneToMany
     *            関連がOneToManyの場合{@code true}
     * @param useforeignKeyName
     *            外部キーをプロパティ名に使うかどうかのフラグ
     * @return 関連名
     */
    protected String getAssociationName(DbForeignKeyMeta fkMeta,
            EntityDesc referencingEntityDesc, EntityDesc referencedEntityDesc,
            boolean oneToMany, boolean useforeignKeyName) {
        String entityName = referencedEntityDesc.getName();
        String associationName = StringUtil.decapitalize(entityName);
        if (!oneToMany) {
            if (useforeignKeyName
                    && fkMeta.getForeignKeyColumnNameList().size() > 0) {
                StringBuilder sb = new StringBuilder();
                for (String columnName : fkMeta.getForeignKeyColumnNameList()) {
                    columnName = StringUtil.camelize(columnName);
                    if (columnName.toUpperCase().endsWith("ID")) {
                        columnName = columnName.substring(0, columnName
                                .length() - 2);
                    } else if (columnName.toUpperCase().endsWith("CODE")) {
                        columnName = columnName.substring(0, columnName
                                .length() - 4);
                    }
                    sb.append(columnName);
                }
                String _associationName = StringUtil
                        .decapitalize(sb.toString());
                boolean existPropertyName = false;
                for (AttributeDesc ad : referencingEntityDesc
                        .getAttributeDescList()) {
                    if (_associationName.equals(ad.getName())) {
                        existPropertyName = true;
                        break;
                    }
                }
                if (!existPropertyName) {
                    associationName = _associationName;
                }
            }
        }

        if (oneToMany) {
            associationName = pluralizeName(associationName);
        }
        if (referencingEntityDesc.hasAssociationDesc(associationName)) {
            for (int i = 2;; i++) {
                if (!referencingEntityDesc.hasAssociationDesc(associationName
                        + i)) {
                    return associationName + i;
                }
            }
        }
        return associationName;
    }

    /**
     * 所有側の関連を処理します。
     * 
     * @param fkMeta
     *            外部キーメタデータ
     * @param ownerEntityDesc
     *            関連の所有者側のエンティティ記述
     * @param inverseEntityDesc
     *            関連の被所有者側のエンティティ記述
     * @return
     */
    protected AssociationDesc doOwnerAssociationDesc(DbForeignKeyMeta fkMeta,
            EntityDesc ownerEntityDesc, EntityDesc inverseEntityDesc) {
        AssociationDesc associationDesc = new AssociationDesc();
        associationDesc.setReferencedCatalogName(fkMeta
                .getPrimaryKeyCatalogName());
        associationDesc.setReferencedSchemaName(fkMeta
                .getPrimaryKeySchemaName());
        associationDesc.setReferencedTableName(fkMeta.getPrimaryKeyTableName());
        String name = getAssociationName(fkMeta, ownerEntityDesc,
                inverseEntityDesc, false, true);
        associationDesc.setName(name);
        if (fkMeta.isUnique()) {
            associationDesc.setAssociationType(AssociationType.ONE_TO_ONE);
        } else {
            associationDesc.setAssociationType(AssociationType.MANY_TO_ONE);
        }
        for (String referencedColumnName : fkMeta.getPrimaryKeyColumnNameList()) {
            associationDesc.addReferencedColumnName(referencedColumnName);
        }
        for (String columnName : fkMeta.getForeignKeyColumnNameList()) {
            associationDesc.addColumnName(columnName);
        }
        associationDesc.setReferencedEntityDesc(inverseEntityDesc);
        ownerEntityDesc.addAssociationDesc(associationDesc);
        return associationDesc;
    }

    /**
     * 被所有側の関連を処理します。
     * 
     * @param fkMeta
     *            外部キーメタデータ
     * @param ownerEntityDesc
     *            関連の所有者側のエンティティ記述
     * @param inverseEntityDesc
     *            関連の被所有者側のエンティティ記述
     * @param mappedBy
     *            関連の所有者側のプロパティ名
     */
    protected void doInverseAssociationDesc(DbForeignKeyMeta fkMeta,
            EntityDesc ownerEntityDesc, EntityDesc inverseEntityDesc,
            String mappedBy) {
        AssociationDesc inverseAssociationDesc = new AssociationDesc();
        if (fkMeta.isUnique()) {
            String name = getAssociationName(fkMeta, inverseEntityDesc,
                    ownerEntityDesc, false, false);
            inverseAssociationDesc.setName(name);
            inverseAssociationDesc
                    .setAssociationType(AssociationType.ONE_TO_ONE);
        } else {
            String name = getAssociationName(fkMeta, inverseEntityDesc,
                    ownerEntityDesc, true, false);
            inverseAssociationDesc.setName(name);
            inverseAssociationDesc
                    .setAssociationType(AssociationType.ONE_TO_MANY);
        }
        inverseAssociationDesc.setMappedBy(mappedBy);
        inverseAssociationDesc.setReferencedEntityDesc(ownerEntityDesc);
        inverseEntityDesc.addAssociationDesc(inverseAssociationDesc);
    }