2011-02-15 10 views
7

Tengo una aplicación Java EE que se ejecuta en tomcat con un par de clases de entidad y usa eclipselink 2.1 y jpa 2.0. Las entidades son EmailNotification y EmailNotificationQueueRow.La entidad no está tejida. Eclipselink 2.1 + Tejido dinámico

@Entity 
public class EmailNotification implements Serializable, IEntity<Integer> { 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "emailGen") 
@SequenceGenerator(name = "emailGen", sequenceName = "SQ_EMAIL_NOTIFICATIONS", allocationSize=1) 
@Basic(optional = false) 
@Column(name = "EMAIL_ID") 
private Integer emailId; 
@Basic(optional = false) 
@Column(name = "EMAIL_SUBJECT") 
private String emailSubject; 
@Basic(optional = false) 
@Column(name = "EMAIL_BODY") 
private String emailBody; 
@Basic(optional = false) 
@Column(name = "SENT_FROM_EMAIL_ADDRESS") 
private String sentFromEmailAddress; 
@Column(name = "SEND_TO_ORG_ID") 
private Integer sendToOrgId; 
@Column(name = "SEND_TO_EMAIL_ADDRESS") 
private String sendToEmailAddress; 
@Column(name = "CARBON_COPY_ORG_ID") 
private Integer carbonCopyOrgId; 
@Column(name = "CARBON_COPY_EMAIL_ADDRESS") 
private String carbonCopyEmailAddress; 
@Column(name = "BCC_ORG_ID") 
private Integer bccOrgId; 
@Column(name = "BCC_EMAIL_ADDRESS") 
private String bccEmailAddress; 
@Column(name = "PROJECT_ID") 
private Integer projectId; 

//getters and setters 
} 

@Entity 
public class EmailNotificationQueueRow implements Serializable, IEntity<Integer> { 

private static final long serialVersionUID = 1L; 
@Id 
@Basic(optional = false) 
@Column(name = "EMAIL_QUEUE_ID") 
private Integer emailQueueId; 
@Basic(optional = false) 
@Column(name = "EMAIL_ID") 
private int emailId; 
@Basic(optional = false) 
@Column(name = "REQUEST_DATE") 
@Temporal(TemporalType.TIMESTAMP) 
private Date requestDate; 
@Basic(optional = false) 
@Column(name = "MESSAGE_SENT_FLAG") 
private String messageSentFlag; 
@Column(name = "MESSAGE_SENT_DATE") 
@Temporal(TemporalType.TIMESTAMP) 
private Date messageSentDate; 
@JoinColumn(name = "EMAIL_ID", referencedColumnName = "EMAIL_ID", updatable = false, insertable = false) 
@OneToOne(fetch = FetchType.LAZY) 
private EmailNotification emailNotification; 

//getters and setters 
} 

Cada vez que puse la relación de la variable EmailNotification a FetchType.LAZY (como arriba) la clase no está tejida. Está registrado para tejer, pero nunca lo está.

El registro está debajo. La entidad EmailNotification está tejida, pero no la entidad EmailNotificationQueueRow. ¿Algunas ideas?

[EL Config]: 2011-02-15 14:21:13.642--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--The access type for the persistent class [class persistence.model.EmailNotification] is set to [FIELD]. 
[EL Config]: 2011-02-15 14:21:13.674--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--The access type for the persistent class [class persistence.model.EmailNotificationQueueRow] is set to [FIELD]. 
[EL Config]: 2011-02-15 14:21:13.674--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--The target entity (reference) class for the one to one mapping element [field emailNotification] is being defaulted to: class persistence.model.EmailNotification. 
[EL Config]: 2011-02-15 14:21:13.689--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--The alias name for the entity class [class persistence.model.EmailNotification] is being defaulted to: EmailNotification. 
[EL Config]: 2011-02-15 14:21:13.72--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--The alias name for the entity class [class persistence.model.EmailNotificationQueueRow] is being defaulted to: EmailNotificationQueueRow. 
[EL Finer]: 2011-02-15 14:21:13.736--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--Class [persistence.model.EmailNotification] registered to be processed by weaver. 
[EL Finer]: 2011-02-15 14:21:13.799--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--Class [persistence.model.EmailNotificationQueueRow] registered to be processed by weaver. 
[EL Finest]: 2011-02-15 14:21:13.799--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--End predeploying Persistence Unit iDMS_Persistence_Unit; session file:/C:/idms/build/web/WEB-INF/classes/_iDMS_Persistence_Unit; state Predeployed; factoryCount 1 
[EL Finest]: 2011-02-15 14:21:13.908--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--Begin weaver class transformer processing class [persistence/model/EmailNotification]. 
[EL Finest]: 2011-02-15 14:21:13.924--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--Weaved persistence (PersistenceEntity) [persistence/model/EmailNotification]. 
[EL Finest]: 2011-02-15 14:21:13.924--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--Weaved change tracking (ChangeTracker) [persistence/model/EmailNotification]. 
[EL Finest]: 2011-02-15 14:21:13.986--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--Weaved fetch groups (FetchGroupTracker) [persistence/model/EmailNotification]. 
[EL Finest]: 2011-02-15 14:21:13.986--ServerSession(1191324)--Thread(Thread[main,5,main]) 
--End weaver class transformer processing class [persistence/model/EmailNotification]. 

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.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_1_0.xsd"> 
    <persistence-unit name="iDMS_Persistence_Unit" transaction-type="JTA"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <jta-data-source>jdbc/dms</jta-data-source> 
    <class>persistence.model.EmailNotification</class> 
    <class>persistence.model.EmailNotificationQueueRow</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
    <property name="eclipselink.weaving" value="true"/> 
    <property name="eclipselink.cache.shared.default" value="false"/> 
    <property name="eclipselink.logging.level" value="FINEST"/> 
    </properties> 
</persistence-unit> 
</persistence> 

actualización

estoy usando la cadena EclipseLink javaagent para iniciar Tomcat. También hay otras asignaciones de OneToOne cargadas de forma holgazana en mi proyecto que se tejen. Es solo esta una clase (EmailNotificationQueueRow) que no se teje.

+0

¿Se puede intentar si se establece 'nullable' en JoinColumn o' optional' en OneToOne para cambiar falsamente algo? Además, ¿qué versión de EclipseLink estás usando? –

Respuesta

4

Estoy un poco confundido . ¿Dice que está usando una aplicación Java EE en Tomcat? No entiendo, ¿Tomcat es solo un contenedor web, no un servidor Java EE?

Un servidor compatible con Java EE permitirá el entrelazado de Entidades JPA administradas durante la implementación, pero Tomcat no es un servidor Java EE.

No estoy seguro de comenzar Tomcat utilizando -javaagent va a funcionar con la forma en que Tomcat carga las clases. Creo que debes usar el tejido estático con Tomcat, o quizás usar Spring. ¿No estás seguro de cómo funcionan algunas clases? ¿Estás seguro de que están siendo tejidos dinámicamente? Probablemente esté relacionado con la forma en que Tomcat está cargando las clases, ¿están implementadas de la misma manera?

+0

Un javaagent puede interceptar todas las clases a medida que se cargan y permite el entrelazado dinámico incluso en un entorno java se.Véase, por ejemplo http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#How_to_Configure_Dynamic_Weaving_for_JPA_Entities_Using_the_EclipseLink_Agent –

+0

Terminé usando el tejido estático. Lo extraño era el tejido dinámico estaba trabajando con el javaagent en otras clases, pero sin la EmailNotificationQueueRow. Con el tejido estático, funcionó en todas las clases. Todavía no está seguro por qué, pero voy a Chock que hasta Tomcat no ser compatible con JEE. – joekarl

3

Por favor asegúrese de que ha agregado el agente EclipseLink a la JVM, utilizando el parámetro JVM

-javaagent:eclipselink.jar 

Para obtener más información, por favor, eche un vistazo a la EclipseLink documentation

+0

Desafortunadamente ya estoy. En otra parte del proyecto, tengo algunas asignaciones uno a uno cargadas perezosamente y funcionan muy bien. Es solo que la entidad EmailNotificationQueueRow no se asigna. Actualizaré mi pregunta para incluir esta información ... – joekarl

3

¿Qué tal el tejido de tiempo de carga de Tomcat? Creo que es la mejor manera. Lo uso con éxito con Tomcat 6/7.
http://static.springsource.org/spring/docs/2.0.x/reference/orm.html#orm-jpa
Capítulo
"12.6.1.3.1. Configuración tejer-tiempo de carga Tomcat (5.0+)"

+0

Aquí es una actualización de la documentación actual: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#orm-jpa-setup-lcemfb – Hartmut

1

He aquí una solución completa para permitir dynamic weaving en su proyecto, sino que también muestra cómo habilitar el tejido estática como bien.

Cuestiones relacionadas