2014-11-17 2 views
2

Я получаю следующее исключение и все это в 1000 раз делали раньше, но теперь я получаю сообщение об ошибке:ValidationException Исключение Описание: используется не объект в качестве целевого объекта в отношениях атрибут

ValidationException Исключение Описание: [класс com.smartphonedev.rsvplaw.entities.Staff] использует не-сущность [класс com.smartphonedev.rsvplaw.entities.Address] как целевой объект в атрибуте отношения [адреса полей].

вот сущности, о которых идет речь , Может ли кто-нибудь помочь мне определить, что не так с моими отношениями?

<code> 
@Entity 
@Table(name="address") 
public class Address implements Serializable, 
{ 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@Column(name="addressType") 
@Enumerated(EnumType.ORDINAL) 
private AddressType addressType; 

@Column(name="streetLineOne") 
private String streetLineOne; 

@Column(name="streetLineTwo") 
private String streetLineTwo; 

@Column(name="city") 
private String city; 

@Column(name="adState") 
private String state; 

@Column(name="postCode") 
private String postCode;  

@OneToMany(fetch=FetchType.LAZY, targetEntity=PhoneNumber.class, cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH},orphanRemoval=true) 
@JoinColumn(name="phoneNumbers") 
private Collection<PhoneNumber> phoneNumbers; 
….. 
} 

@Entity 
@Table(name="staff") 
public class Staff implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

//private Profile profile; 
@OneToOne(fetch=FetchType.LAZY,cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}) 
@JoinColumn(name="permission") 
private Permission permission; 

@OneToOne(fetch=FetchType.LAZY,cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}) 
@JoinColumn(name="login")  
private Login login; 

@Column(name="firstName") 
private String firstName; 

@Column(name="surnameName") 
private String surnameName; 

@Column(name="emailAddress") 
private String emailAddress; 

@OneToMany(fetch=FetchType.LAZY, targetEntity=PhoneNumber.class, cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH},orphanRemoval=true) 
@JoinColumn(name="phoneNumbers") 
private Collection<PhoneNumber> phoneNumbers; 

@OneToMany(fetch=FetchType.LAZY, targetEntity=Address.class, cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH},orphanRemoval=true) 
@JoinColumn(name="addresses") 
private Collection<Address> addresses; 
} 
</code 

Добавление класса PHONENUMBER @Entity @Table(name="phone") public class PhoneNumber implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id;

@Column(name="numberType") 
@Enumerated(EnumType.ORDINAL) 
private PhoneNumberType numberType; 

@Column(name="phoneNumber") 
private String phoneNumber; 
} 
</code> 

Adding persistance.xml

<code> 

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
<persistence-unit name="RSVPLawServerPU" transaction-type="JTA"> 
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
<jta-data-source>jdbc/RSVPLaw</jta-data-source> 
<class>com.smartphonedev.rsvplaw.entities.PhoneNumber</class> 
<class>com.smartphonedev.rsvplaw.entities.Address</class> 
<exclude-unlisted-classes>false</exclude-unlisted-classes> 
<shared-cache-mode>NONE</shared-cache-mode> 
<validation-mode>CALLBACK</validation-mode> 
<properties> 
    <property name="eclipselink.target-server" value="SunAS9"/> 
    <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> 
    <property name="eclipselink.ddl-generation" value="create-tables"/> 
    <property name="eclipselink.ddl-generation.output-mode" value="database"/> 
    <property name="javax.persistence.schema-generation.database.action" value="create"/> 
</properties> 
</persistence-unit> 
</persistence> 

<code> 
+0

'@ OneToMany' должен быть' mappedBy', а '@ ManyToOne' должен сопровождаться' @ JoinColumn' –

+0

@guido OneToMany имеет «mappedBy» ТОЛЬКО, если он двунаправлен ... так как вы знаете, что он находится в этот случай, когда он не показывает класс PhoneNumber? –

+0

http://stackoverflow.com/questions/11938253/jpa-joincolumn-vs-mappedby –

ответ

0

I am in this same situation while separating a @ManyToMany отношения в двух @OneToMany/@ManyToOne отношений, и я решил. Вот несколько советов, заключаемых от всех вышеперечисленных ответов, и мое открытие:

  1. убедитесь, что класс с аннотацией @Entity, и имеют правильную Table(name=xxx).
  2. Если вы используете JPA, убедитесь, что оно находится в persistence.xml. Если вы используете Hibernate, убедитесь, что он находится в hibernate.cfg.xml. При использовании обоих в обоих файлах.
  3. Убедитесь, что классы находятся в том же JAR, что и файлы mapping/cfg.
  4. Одна вещь, которую я нашел: Вам не нужно удалять mappedBy=, но вы должны убедиться, что имя атрибута уникально во всем проекте!

как в моем случае: если удалить mappedBy в моей @OneToMany стороны (в то время как @ManyToOne стороны представляет собой промежуточный класс для @ManyToMany отношений, которая имеет свои собственные поля, так что я должен сделать это @Entity вместо того, чтобы использовать середину таблица напрямую), EclipseLink жалуется на таблицу с именем «EntityA_MiddleEntity», которой не существует. Я думаю, при встрече с mappedBy=xxx EclipseLink ищет все объекты с полями с именем xxx, а когда он существует более чем в одном классе, а один из этих классов является промежуточным классом для @ManyToMany, он не связывает их. Поэтому я изменил имя атрибута в среднем классе, и все работает нормально.