Ответ 1
Убедитесь, что у вас есть оба класса, перечисленные в вашем persistence.xml, и оба класса находятся в пути к классам.
Пожалуйста, укажите ваш persistence.xml.
Я пытаюсь сохранить классы Department
и Mandator
в hsqhldb, но он дает эту ошибку.
Exception Description: [class ch.printsoft.mailhouse.usermgr.entity.Mandator] uses a non-entity [class ch.printsoft.mailhouse.usermgr.entity.Department] as target entity in the relationship attribute [field departments].
at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:126)
at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:115)
at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
Это классы, которые я пытаюсь сохранить в моей базе данных. Я действительно не знаю, в чем проблема.
@Entity
public class Mandator {
@Id
@GeneratedValue
private Integer id;
private String mandatorId;
@OneToMany(mappedBy = "mandator")
private List<MandatorUser> mandatorUsers;
@OneToMany(mappedBy = "mandator")
private List<SLAFamilyGroup> slaFamilyGroups;
@OneToMany(mappedBy = "mandator")
private List<Group> groups;
@OneToMany(mappedBy = "mandator")
private List<Department> departments;
@OneToMany(mappedBy = "mandator")
private List<CostUnit> costUnits;
@Entity
public class Department {
@Id
@GeneratedValue
private Integer id;
private String name;
private String responsiblePerson;
private String location;
@ManyToOne(optional = false)
private Mandator mandator;
@ManyToMany
private List<DocumentUser> documentUsers;
Я действительно пробовал все, но это не сработало.
Убедитесь, что у вас есть оба класса, перечисленные в вашем persistence.xml, и оба класса находятся в пути к классам.
Пожалуйста, укажите ваш persistence.xml.
Я просто потратил много времени на отладку, казалось бы, необъяснимого случая этого исключения, поэтому я просто оставляю свою историю здесь.
Если вы используете несколько старую реализацию JPA (например, EclipseLink 2.5.x), и вы используете современные функции Java 8 (например, лямбда-выражения) в своей базе кода - не никогда использовать их в классах сущностей JPA.
Парсер метаданных класса EclipseLink 2.5 падает при столкновении с функциями Java 8 (такими как лямбда-выражения, ссылки на методы и т.д.) в байт-коде. Внутренний сбой - очень недружелюбный ArrayIndexOutOfBoundsException
, но вы даже не видите его, так как код ткача молча игнорирует сбои парсера метаданных и просто предполагает, что класс не содержит интересных метаданных. Это заставляет полагать, что рассматриваемый класс не является сущностью, хотя он имеет все соответствующие аннотации, и конечным результатом является сообщение об ошибке, о котором мы говорим.
Нижняя строка: Не используйте ямбды Java 8 в классах сущностей JPA. EVER.
Я надеюсь, что это может помочь кому-то.
У меня была та же проблема. Ночью накануне все было в порядке. В NetBeans я проверил, используя Историю, все файлы, участвующие в ошибке. Включен Persistence.xml. Ничего не изменилось.
Я также проверил вручную. Я попробовал все предлагаемое в этой теме решение даже перейти на eclipselink 2.6.4. Я удалил 2 класса, участвующих в файле persistence.xml, сохранил его и добавил снова. Ошибка все еще была.
Затем я удалил ВСЕ классесу в списке классов сущностей, включенных в файл persistence.xml, а затем включил их снова.
Теперь он работает. Волшебно.
Но на самом деле в истории не было разницы. Даже один символ.
Удалить mappedBy из @OneToMany аннотаций из класса Mandator
Проверьте, отображаются ли все связанные классы в виде @Entity. Класс отдела имеет отношение @ManyToMany к DocumentUser. Предоставьте список класса DocumentUser
Убедитесь, что оба файла класса находятся в одном банке. Убедитесь, что у вас нет двух файлов .class с тем же именем!
Убедитесь, что оба класса имеют свойство PK и конструктор no parameter. Я добавляю следующий код в класс сущности.
@Entity
public class EntityClass{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int id;
public EntityClass() {
}
...
}
Изучите свой mappedBy=xxx
и убедитесь, что xxx
уникален для всего проекта.