Атрибуты JPA производного объекта не загружаются, если он содержит код SAX - PullRequest
1 голос
/ 05 марта 2012

Я использую наследование одной таблицы, как объяснено здесь в среде Glassfish 3.1.Пока все работает как положено.Но после добавления некоторого кода в производную сущность для анализа строки XML, JPA больше не загружает атрибуты базовой сущности.

Я создал пример проекта netbeans для воспроизведения этой проблемы, вы можете загрузитьэто из github здесь .

Вот базовая сущность, определяющая поле дискриминатора и testField:

@Entity
@DiscriminatorColumn(name="discriminator")
@XmlRootElement
public class BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String testField;
    private String discriminator;

    public String getDiscriminator() {
        return discriminator;
    }

    public void setDiscriminator(String discriminator) {
        this.discriminator = discriminator;
    }

    public String getTestField() {
        return testField;
    }

    public void setTestField(String testField) {
        this.testField = testField;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof BaseEntity)) {
            return false;
        }
        BaseEntity other = (BaseEntity) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.ce.entityloadingbug.entites.NewEntity[ id=" + id + " ]";
    }

}

А вот код производной сущности сзакрытый метод, содержащий код, который заставляет jpa больше не загружать поля ...

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

/**
 *
 * @author stefan
 */
@Entity
@DiscriminatorValue("derived")
public class DerivedEntity extends BaseEntity {

    /**
     * The problem code
     */
    private void theProblemCode() {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db;
        try {
            db = dbf.newDocumentBuilder();

            // This is the line that makes Problems!!
            Document doc = db.parse("");
        }catch(Exception e) {
            System.out.println(e);
        }
    }
}

Как только я удаляю строку "Document doc = db.parse (" ")", все снова работает.Как вы можете видеть, проблема существует, хотя код, который вызывает проблему, никогда не вызывается.

В настоящее время я хочу переместить этот код во внутренний класс.Но мне это не нравится, потому что я не знаю, в чем проблема.

Пожалуйста, не стесняйтесь скачать мой пример проекта с github и попробовать его.

Вот мои настройки, которые я использовалчтобы воспроизвести эту ошибку:

  • Glassfish 3.1.1
  • IDE NetBeans 7.0.1
  • База данных: Derby 10.6.2.1
  • JPA: EclipseLink2.3

На самом деле все библиотеки, которые я использовал, были поставлены с установкой NetBeans IDE 7.0.1 для Linux.,Спасибо за любые ответы или предложения.

1 Ответ

0 голосов
/ 05 марта 2012

Это очень странно.Проверьте ваш журнал на наличие ошибок или любой регистрации.Включите лучший вход в EclipseLink в вашем файле persistence.xml, чтобы произошла странная ошибка.

Убедитесь, что оба класса перечислены в вашем файле persistence.xml.

Также попробуйте отключить ткачество ("eclipselink.weaving"= "false"), это влияет на проблему?

Также включает в себя SQL, который регистрируется, он выбирает данные?

...