我试图将一个框架从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个