Я использую наследование одной таблицы, как объяснено здесь в среде 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.,Спасибо за любые ответы или предложения.