これは基本的にフォローアップの質問または質問としての再投稿です。JPAで列挙型を使用する方法は独自の方法で解決されたようです。これは、基本的に同じ2012 JPAの質問であり、ここではEclipseLink2.3.2を使用しています。
問題は、Java列挙型を異なる名前のDB文字列にマップする方法です。'M'
VARCHAR値、、、、および'C'
のDB列があります。それらは不可解であり、英語とドイツ語が混在しています。ビジネスレイヤーを改善するために、Java列挙型を上記のDB文字列にマップします。'N'
'F'
public enum TradingSector
{
EMPLOYEE( "M" ), // Mitarbeiter
CUSTOMER( "C" ),
NOSTRO( "N" ),
FUND( "F" );
// this works:
// M( "M" ),
// C( "C" ),
// N( "N" ),
// F( "F" );
private final String ch;
private TradingSector( String ch )
{
this.ch = ch;
}
@Override
public String toString()
{
return this.ch;
}
}
エンティティは次のとおりです。
@Entity
@Table( name = "TRADES" )
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
@DiscriminatorColumn( name = "NOSTRO_FLAG", discriminatorType = DiscriminatorType.STRING, length = 1 )
public class Trade implements Serializable
{
@Enumerated( EnumType.STRING )
@Column( name = "NOSTRO_FLAG", insertable = false, updatable = false )
private TradingSector discriminator;
...
}
これは一種の特別なものであり、列挙型をすでに継承識別子であるものにマッピングします。ただし、DB文字列のように名前が付けられた列挙型が示すように、これは機能するはずです。
このTRADES
テーブルは、現在、コンテキスト全体で最もモノリシックなテーブルであり、エンティティをサブクラスに分割することが望ましいです。
toString
私が読んだものから単にオーバーライドすることを期待していましたが、これは次の結果になります。
Caused by: Exception [EclipseLink-116] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: No conversion value provided for the value [M] in field [TRADES.TRADING_SECTOR].
Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping[discriminator-->TRADES.TRADING_SECTOR]
Descriptor: RelationalDescriptor(com.company.project.model.Trade --> [DatabaseTable(TRADES)])
at org.eclipse.persistence.exceptions.DescriptorException.noFieldValueConversionToAttributeValueProvided(DescriptorException.java:1052)
at org.eclipse.persistence.mappings.converters.ObjectTypeConverter.convertDataValueToObjectValue(ObjectTypeConverter.java:140)
at org.eclipse.persistence.mappings.converters.EnumTypeConverter.convertDataValueToObjectValue(EnumTypeConverter.java:137)
at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.getAttributeValue(AbstractDirectMapping.java:699)
at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.valueFromRow(AbstractDirectMapping.java:1299)
at org.eclipse.persistence.mappings.DatabaseMapping.readFromRowIntoObject(DatabaseMapping.java:1326)
http://wiki.eclipse.org/EclipseLink_Exception_Error_Reference_%28ELUG%29にあるEclipseLinkエラードキュメントの内容は次のとおりです。
ECLIPSELINK-00116: No conversion value provided for the value [{0}] in field [{1}].
Cause: The attribute conversion value for the fieldValue was not given in the object type mapping.
Action: Verify the field value, and provide a corresponding attribute value in the mapping.
ああ、そうです。:-/
Q:これを解決するための非独占的(JPA 2)の方法は何ですか(ハッキングの塹壕に行き過ぎずに、それが可能であれば)?
PS:DB値を変更することはできません。