フレームワークを hibernate3 から 4 に移行しようとしていますが、このコードは 3 で機能しました。フレームワークはインターフェイスを使用して、クラスの密結合を解除します。したがって:
Entity クラスは @Entity でマークされ、このインスタンスはそのインターフェースとして定義された @Embeddable のインスタンスを使用します。これは、Spring で非常によく知られているパターンです。
コードは hibernate (V3) の古いバージョンで正常に動作します。JPA2 および Hibernate 4 に移動しています。
Hibernate では、インターフェイスのどの実装 (具象クラス) がマップされているかを判断するのが難しいことを認識しています。したがって、エラーは理解できますが、古いバージョンでも機能します。
これは、JPA2 と H4 で抽象化された古いバージョンの休止状態のテンプレートとマッピング クラスによるものですか。
クラスを実装するすべてのインターフェイスの具象実装を単純に作成し、@embedded を具象クラスとして定義するのが最善の方法です。
よろしくお願いします。
// エンティティ クラス HibAttribute
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
// Define a unique constraint on item, namespace, and localname
@Table(name="attribute", uniqueConstraints = {
@UniqueConstraint(columnNames={"itemid", "namespace", "localname"})})
// Define indexes on discriminator and key fields
@org.hibernate.annotations.Table(
appliesTo="attribute",
indexes={@Index(name="idx_attrtype", columnNames={"attributetype"}),
@Index(name="idx_attrname", columnNames={"localname"}),
@Index(name="idx_attrns", columnNames={"namespace"})})
@DiscriminatorColumn(
name="attributetype",
discriminatorType=DiscriminatorType.STRING,
length=16)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public abstract class HibAttribute extends HibAuditableObject implements java.io.Serializable, Attribute {
// Fields
@Embedded
@AttributeOverrides( {
@AttributeOverride(name="namespace", column = @Column(name="namespace", nullable = false, length=255) ),
@AttributeOverride(name="localName", column = @Column(name="localname", nullable = false, length=255) )
} )
private QName qname;
// The interface public interface QName {
/**
* Get local name
* @return local name
*/
public String getLocalName();
/**
* Set local name
* @param localName local name
*/
public void setLocalName(String localName);
/**
* Get namespace
* @return namespace
*/
public String getNamespace();
/**
* Set namespace
* @param namespace namespace
*/
public void setNamespace(String namespace);
/**
* Create copy of QName object.
* @return copy of current QName object
*/
public QName copy();
}
@Embeddable
public class HibQName implements QName {
public static final String DEFAULT_NAMESPACE = "org.osaf.cosmo.default";
private String namespace = null;
private String localName = null;
public HibQName() {}
/**
* Create new QName with specified namespace and local name.
* @param namespace namespace
* @param localName local name
*/
public HibQName(String namespace, String localName) {
this.namespace = namespace;
this.localName = localName;
}
// クラスの残りは省略されています ....... この問題を理解する必要はありません。
スタック トレース: 原因: org.hibernate.MappingException: 次のタイプを特定できませんでした: org.timbre.model.QName、テーブル: 属性、列: [org.hibernate.mapping.Column(attributes_KEY)] at org. hibernate.mapping.SimpleValue.getType(SimpleValue.java:304) org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:288) org.hibernate.mapping.IndexedCollection.validate(IndexedCollection.java:90) org .hibernate.cfg.Configuration.validate(Configuration.java:1294) org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1732) org.hibernate.ejb.EntityManagerFactoryImpl.(EntityManagerFactoryImpl.java:88) org .hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904) ... 57 もっと見る