Ошибка jpa использует не-сущность [класс ch.printsoft.mailhouse.usermgr.entity.Department] как целевой объект в атрибуте отношения

Я пытаюсь сохранить классы 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;

Я действительно пробовал все, но это не сработало.

Ответ 1

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

Пожалуйста, укажите ваш persistence.xml.

Ответ 2

Я просто потратил много времени на отладку, казалось бы, необъяснимого случая этого исключения, поэтому я просто оставляю свою историю здесь.

Если вы используете несколько старую реализацию JPA (например, EclipseLink 2.5.x), и вы используете современные функции Java 8 (например, лямбда-выражения) в своей базе кода - не никогда использовать их в классах сущностей JPA.

Парсер метаданных класса EclipseLink 2.5 падает при столкновении с функциями Java 8 (такими как лямбда-выражения, ссылки на методы и т.д.) в байт-коде. Внутренний сбой - очень недружелюбный ArrayIndexOutOfBoundsException, но вы даже не видите его, так как код ткача молча игнорирует сбои парсера метаданных и просто предполагает, что класс не содержит интересных метаданных. Это заставляет полагать, что рассматриваемый класс не является сущностью, хотя он имеет все соответствующие аннотации, и конечным результатом является сообщение об ошибке, о котором мы говорим.

Нижняя строка: Не используйте ямбды Java 8 в классах сущностей JPA. EVER.

Ответ 3

Я надеюсь, что это может помочь кому-то.

У меня была та же проблема. Ночью накануне все было в порядке. В NetBeans я проверил, используя Историю, все файлы, участвующие в ошибке. Включен Persistence.xml. Ничего не изменилось.

Я также проверил вручную. Я попробовал все предлагаемое в этой теме решение даже перейти на eclipselink 2.6.4. Я удалил 2 класса, участвующих в файле persistence.xml, сохранил его и добавил снова. Ошибка все еще была.

Затем я удалил ВСЕ классесу в списке классов сущностей, включенных в файл persistence.xml, а затем включил их снова.

Теперь он работает. Волшебно.

Но на самом деле в истории не было разницы. Даже один символ.

Ответ 4

Удалить mappedBy из @OneToMany аннотаций из класса Mandator

Проверьте, отображаются ли все связанные классы в виде @Entity. Класс отдела имеет отношение @ManyToMany к DocumentUser. Предоставьте список класса DocumentUser

Ответ 5

Убедитесь, что оба файла класса находятся в одном банке. Убедитесь, что у вас нет двух файлов .class с тем же именем!

Ответ 6

Убедитесь, что оба класса имеют свойство PK и конструктор no parameter. Я добавляю следующий код в класс сущности.

@Entity
public class EntityClass{
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   public int id;
   public EntityClass() {
   } 
   ...
}

Ответ 7

Изучите свой mappedBy=xxx и убедитесь, что xxx уникален для всего проекта.