3

オブジェクトの主キーにPostgreSQLuuidタイプを使用したい。そのために、コンバーターを作成しました(コンバーターインターフェイスを実装します)。以下は関連するコードです:

    @Override
    public void initialize(DatabaseMapping mapping, Session session) {
        final DatabaseField field;
        if (mapping instanceof DirectCollectionMapping) {
            field = ((DirectCollectionMapping) mapping).getDirectField();
        } else {
            field = mapping.getField();
        }

        field.setSqlType(Types.OTHER);
        field.setTypeName("uuid");
        field.setColumnDefinition("UUID");
    }

次に、関連するエンティティXに次の注釈を付けました。

@Converter(name="uuidConverter",converterCalss=UUIDConverter.class)
@Convert("uuidConverter")
@Id
public UUID getId()
{
    return id;
}

問題は、次の定義を持つ別のクラス(Y)があることです。

@ManyToOne(targetEntity = X.class)
@JoinColumn(name = "x_id")
public X getX();

EclipseLinkは期待どおりにテーブルを作成しましたが、タイプYのオブジェクトを挿入しようとすると、データベースに文字列を送信します。Postgresは次のエラーメッセージを返します。

column "id" is of type uuid but expression is of type character varying at character

任意の解決策/回避策をいただければ幸いです。

4

6 に答える 6

2

EclipseLink JPA + Postgresql + UUID を主キーとして同じ問題が発生しました。

それを解決するために、Github と以下のリンクからコードをマージしました: https://forums.oracle.com/forums/thread.jspa?messageID=4584157

コードは確かに最高ではありませんが、UUIDConverter の以下のコードは私にとってはうまくいきました。

public void initialize(DatabaseMapping ARGMapping, Session ARGSession)
{
    final DatabaseField Field;
    if (ARGMapping instanceof DirectCollectionMapping)
    {
        Field = ((DirectCollectionMapping) ARGMapping).getDirectField();
    }
    else
    {
        Field = ARGMapping.getField();
    }
    Field.setSqlType(Types.OTHER);
    Field.setTypeName("uuid");
    Field.setColumnDefinition("UUID");

    for (DatabaseMapping m : ARGMapping.getDescriptor().getMappings())
    {
        assert OneToOneMapping.class.isAssignableFrom(ManyToOneMapping.class);
        if (m instanceof OneToOneMapping)
        {
            for (DatabaseField field : ((OneToOneMapping) m).getForeignKeyFields())
            {
                field.setSqlType(Types.OTHER);
                field.setColumnDefinition("UUID");
                field.setTypeName("uuid");
            }
        }
    }
}
于 2013-02-26T08:54:22.370 に答える
1

initialize メソッドでマッピングの fieldClassification が何であるかを確認してみてください。何とかString.classを取得しているのかもしれませんので、Object.classに設定してみてください。

または、field.setType(Object.class)

于 2012-11-12T15:25:59.413 に答える