MappingException:无法确定类型;使用@Embeddable和@Embedded

时间:2012-10-04 21:55:13

标签: hibernate jpa-2.0 hibernate-mapping

我试图将一个框架从hibernate3移动到4,这个代码在3中工作。框架使用Interfaces来打破类的紧密耦合。因此:

Entity类用@Entity标记,并且该实例使用和@Embeddable的实例定义为其接口,这是Spring中非常熟悉的模式。

代码在旧版本的hibernate(V3)中工作正常,我将其移至JPA2和Hibernate 4

我意识到Hibernate将很难确定接口的哪个实现(具体类)正在被映射。因此,我理解错误,但它确实适用于旧版本。

这是由于旧版本中的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的类型,在table:attribute,对于列:[org.hibernate.mapping.Column(attributes_KEY)]     在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个

0 个答案:

没有答案