1

私のJavaアプリケーション内では、次のように列挙型のコレクションを使用しています:

@ElementCollection
@Enumerated(EnumType.ORDINAL)
protected Set<Tag> tags = new TreeSet<>();

ただし、この定義は in で与えられているため、名前が子クラス内で衝突するため、in@MappedSuperClassで定義することはできません。私の問題は、デフォルトの休止状態の命名ポリシーが無視されることです。たとえば、名前のテーブルの代わりに継承されたクラスの場合、休止状態は使用しようとしており、フィールドの代わりに使用しようとしています。Hibernate は命名ポリシーを完全に無視し、エンティティ名を変更せずに使用しているように思えます。name@JoinTableEventevent_tagsEvent_tagsevent_idEvent_id

デフォルトの命名ポリシーを強制的に使用するにはどうすればよいですか?

4

1 に答える 1

0

デフォルトの命名ポリシーではこれらを処理できないようで、独自に実装する必要があります。例えば:

public class NamingPolicy implements NamingStrategy, Serializable {

    @Override
    public String classToTableName(String className) {
        return StringHelper.unqualify(className).toLowerCase();
    }



    @Override
    public String propertyToColumnName(String propertyName) {
        return StringHelper.unqualify(propertyName);
    }



    public String singularize(String propertyName) {
        if (propertyName != null && propertyName.endsWith("s")) {
            propertyName = propertyName.substring(0, propertyName.length() - 1);
        }

        return propertyName;
    }



    @Override
    public String tableName(String tableName) {
        return tableName;
    }



    @Override
    public String columnName(String columnName) {
        return columnName;
    }



    @Override
    public String collectionTableName(
            String ownerEntity, String ownerEntityTable, String associatedEntity,
            String associatedEntityTable, String propertyName) {

        return classToTableName(ownerEntityTable) + "_" + 
                or(associatedEntityTable, singularize(propertyName));
    }



    @Override
    public String joinKeyColumnName(String joinedColumn, String joinedTable) {
        return columnName(joinedColumn);
    }



    @Override
    public String foreignKeyColumnName(
            String propertyName, String propertyEntityName,
            String propertyTableName, String referencedColumnName) {

        String header = propertyName != null ? propertyName : propertyTableName;
        if (header == null) {
            throw new AssertionFailure("NamingStrategy not properly filled");
        }

        return classToTableName(header) + "_" + referencedColumnName;
    }



    @Override
    public String logicalColumnName(String columnName, String propertyName) {
        return StringHelper.isNotEmpty(columnName)
                ? columnName : StringHelper.unqualify(propertyName);
    }



    @Override
    public String logicalCollectionTableName(
            String tableName, String ownerEntityTable, String associatedEntityTable, String propertyName) {


        if (tableName != null) {
            return tableName;
        } else {
            return tableName(ownerEntityTable) + "_" + (associatedEntityTable != null
                    ? associatedEntityTable
                    : singularize(propertyName));
        }
    }



    @Override
    public String logicalCollectionColumnName(
            String columnName, String propertyName, String referencedColumn) {
        return StringHelper.isNotEmpty(columnName)
                ? columnName
                : classToTableName(propertyName) + "_" + singularize(referencedColumn);
    }
}
于 2013-11-10T08:24:11.413 に答える