0

エンティティのサブクラスで AttributeConverter をオーバーライドしたいという問題がありますが、サブクラスで定義されたコンバーターが呼び出されません。AttributeConverter のドキュメントによると、これが正しいはずですが、私にはうまくいきません。私は何を間違っていますか?

@Entity
@org.hibernate.annotations.DynamicUpdate(value = true)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("ORDER")
public class Order implements Serializable
{
...
    @Column(name = "PRODUCT_SERIALIZED", updatable = false)
    @Convert(converter = ProductConverter.class)
    protected Product product;
...
}
@Entity
@DiscriminatorValue("CUSTOMER_ORDER")
@Convert(attributeName = "product", converter = CustomerProductConverter.class)
public class CustomerOrder extends Order
{
...
4

1 に答える 1

0

@Convert は、スーパークラスのフィールドの既存のコンバーターをオーバーライドするのには適していないようです。別の方法で解決しました。CDI を介して conversionService をスーパークラスの AttributeConverter に注入し、これを特殊化できます。

@Converter
public class ProductConverter implements AttributeConverter<Product, String>
{
    ProductConverterService converterBean = null;

    @Override
    public String convertToDatabaseColumn(Product attribute)
    {
        return getConverterService().convertToDatabaseColumn(attribute);
    }

    @Override
    public Product convertToEntityAttribute(String dbData)
    {
        return getConverterService().convertToEntityAttribute(dbData);
    }

    public ProductConverterService getConverterService()
    {
        if (converterBean == null)
        {
            //since ProductConverter is obiously not managed via CDI
            converterBean = CDI.current().select(ProductConverterService.class).get();
        }
        return converterBean;
    }
}
于 2020-12-04T18:09:50.820 に答える