2011-11-27 16 views
18

Estoy usando EclipseLink 2.3.1 para modelar la tabla de autorreferenciación con JPA 2. Recibo una advertencia extraña de EclipseLink cuando creo EntityManager.No puedo entender la advertencia de EclipseLink

[EL Warning]: 2011-11-27 14:28:00.91--ServerSession(8573456)--Reverting the lazy setting on the OneToOne or ManyToOne attribute [redirectID] for the entity class [class lp.db.model.Site] since weaving was not enabled or did not occur. 

No pude encontrar ninguna documentación sobre esta advertencia, y no estoy seguro de lo que significa. También quiero saber cómo resolver el problema que hace que aparezca esta advertencia ...

Soy nuevo en JPA, por lo que podría ser una tontería. Mi programa es realmente simple. Esta es la definición de la entidad:

@Entity 
@Table(name="site") 
public class Site implements Serializable { 

private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="site_id") 
    public String siteID; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="redirect_id", referencedColumnName="site_id") 
    public Site redirectID; 

    @Column(name="name") 
    public String name; 
} 

Aquí está la persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="lpdb2" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>lp.db.model.Site</class> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/lpdb2"/> 
      <property name="javax.persistence.jdbc.user" value="blabla"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

El código que hace que esta advertencia:

Persistence.createEntityManagerFactory("lpdb2").createEntityManager(); 

Tenga en cuenta que la EM es que resulta muy bien y pueden ser utilizado (por ejemplo) para encontrar elementos. Además, puedo recorrer el gráfico de entidades: puedo encontrar una entidad en la base de datos y luego obtener otra entidad usando el campo redirectID.

Respuesta

20

Ver http://wiki.eclipse.org/Introduction_to_EclipseLink_Application_Development_%28ELUG%29#Using_Weaving.

Para que la recuperación diferida sea posible en las asociaciones XxxToOne, el código de byte de las entidades JPA debe modificarse (eso es lo que significa tejer). Si no se modifica, una asociación XxxToOne solo puede ser buscada ansiosamente.

La obtención urgente significa que cada vez que carga un Site de la base de datos, también se carga su redirectID. Con la recuperación diferida, carga un sitio y su redireccionamiento solo se carga (de forma diferida) cuando llama a un método en el campo redirectID.

+0

Gracias! Por alguna razón, salté este recurso. Lo revisaré. – gamliela

+3

Tuve que agregar -javaagent: eclipselink.jar a la línea de comandos de JVM para que el tejido dinámico funcione. Ver http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Performance/Weaving/Dynamic_Weaving – Nathan

Cuestiones relacionadas