Ошибка jpa использует не-сущность [класс ch.printsoft.mailhouse.usermgr.entity.Department] в качестве целевой сущности в атрибуте отношения - PullRequest
14 голосов
/ 02 декабря 2011

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

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

Ответы [ 7 ]

42 голосов
/ 05 декабря 2011

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

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

38 голосов
/ 11 октября 2016

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

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

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

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

3 голосов
/ 11 августа 2017

Надеюсь, это кому-нибудь поможет.

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

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

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

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

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

1 голос
/ 02 декабря 2011

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

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

0 голосов
/ 30 октября 2015

Проверьте ваш mappedBy=xxx и убедитесь, что xxx уникален во всем проекте.

0 голосов
/ 04 августа 2015

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

@Entity
public class EntityClass{
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   public int id;
   public EntityClass() {
   } 
   ...
}
0 голосов
/ 04 сентября 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...