Как обновить схему, добавив аннотированные классы в существующий блок Persistence в JPA с помощью гибернации?

Среда: JPA 2.0, Hibernate 3.6, в файле war (с jsf 2.0, на jboss 6 и т. д.).
Я хочу обновить схему, добавив классы Annotated в существующий модуль Persistence в JPA с спящим режимом. это то, что я пытался сделать:

public void updateConfiguration() {
    // load classes
    Ejb3Configuration ejb3Configuration = new Ejb3Configuration();
    ejb3Configuration = ejb3Configuration.configure("existingPU", null);
    loadModel(ejb3Configuration);
    updateSchema(ejb3Configuration.getHibernateConfiguration());
}

private void updateSchema(Configuration cfg) {
    SchemaUpdate schemaUpdate = new SchemaUpdate(cfg);
    schemaUpdate.execute(true, true);
}

private void loadModel(Ejb3Configuration ejb3Configuration) {
    for (Object _object : objectList) {
        ejb3Configuration.addAnnotatedClass(_object.getClass());
    }

}

existingPU загружается обычным способом JPA с использованием persistence.xml и т. д. Схема обновляется для сущностей в WEB-INF/classes, и эта часть базы кода работает отлично. Теперь новые классы в objectList расширяют @MappedSuperclass из WEB-INF/classes, который имеет

@MappedSuperclass
public abstract class OwnerHolder implements Serializable {
    private User owner;
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "fk_owner_id")
    public User getOwner() {
         return owner;
    }

    public void setOwner(User owner) {
        this.owner= owner;
    }
}

Этот класс также расширяется классами в WEB-INF/classes, и этот код работает нормально. Ошибка, которую я получаю, выглядит следующим образом:

13:36:45,494 ERROR [org.hibernate.tool.hbm2ddl.SchemaUpdate] could not complete schema update: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.myproject.external.model.PurchaseOrder.owner references an unknown entity: com.myproject.model.User
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:107) [:3.6.0.Final]
at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1550) [:3.6.0.Final]
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1473) [:3.6.0.Final]
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1389) [:3.6.0.Final]
at org.hibernate.cfg.Configuration.generateSchemaUpdateScript(Configuration.java:1160) [:3.6.0.Final]
at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:187) [:3.6.0.Final]
at com.myproject.MyConfiguration.updateSchema(MyConfiguration.java:43) [:]

objectList — это список классов из файла jar, размещенного в WEB-INF/lib.

Не могли бы вы мне помочь?


person Bhuvanesh Phadnis    schedule 26.06.2011    source источник
comment
дальнейший прогресс: я перезагрузил все Сущности, в том числе те, которые были загружены ранее при запуске, в loadModel(Ejb3Configuration) и все работает нормально. что в основном означает, что Ejb3Configuration, который я загрузил, не содержит объектов, которые были загружены при запуске. Любая идея, почему это произойдет?   -  person Bhuvanesh Phadnis    schedule 27.06.2011


Ответы (1)


Проверьте, есть ли в объявлении класса User аннотация @Entity.

person peshkira    schedule 26.06.2011
comment
спасибо @peshkira. Я проверил все контрольно-пропускные пункты, которые вы упомянули. все в порядке. что касается аннотаций, они постоянно находятся в свойстве get, включая @Id, как указано в ссылка. Также, как упоминалось ранее, код модели внутри WEB-INF/classes работает нормально. внутри WEB-INF/classes есть около 20 классов, расширяющих OwnerHolder, и все в порядке. Мой вывод: когда я пытаюсь добавить новый класс Annotated в existingPU, старых там нет - person Bhuvanesh Phadnis; 26.06.2011