Сущность не соткана.Eclipselink 2.1 + Динамическое Плетение - PullRequest
7 голосов
/ 15 февраля 2011

У меня есть приложение Java EE, которое работает на tomcat с парой классов сущностей и использует eclipselink 2.1 и jpa 2.0. Объектами являются EmailNotification и EmailNotificationQueueRow.

@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
}

Всякий раз, когда я устанавливаю отношение переменной emailNotification к FetchType.LAZY (как указано выше), класс не является тканым. Он зарегистрирован для ткачества, но никогда не был.

Журнал ниже. Сущность EmailNotification сплетена, но не сущность EmailNotificationQueueRow. Есть идеи?

[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>

Обновление

Я использую строку eclipselink javaagent для запуска tomcat. Также есть другие сопоставления OneToOne, которые лениво загружаются в моем проекте, которые переплетаются. Только этот один класс (EmailNotificationQueueRow) не переплетается.

Ответы [ 4 ]

4 голосов
/ 17 февраля 2011

Я несколько растерялся. Вы говорите, что используете приложение Java EE в Tomcat? Я не понимаю, Tomcat - это просто веб-контейнер, а не сервер Java EE?

Совместимый сервер Java EE позволит создавать управляемые объекты JPA во время развертывания, но Tomcat не является сервером Java EE.

Я не уверен, что запуск Tomcat с использованием -javaagent будет работать так же, как Tomcat загружает классы. Я думаю, что вы должны использовать статическое плетение с Tomcat, или, возможно, использовать Spring. Не знаете, как у вас работают классы? Вы уверены, что их динамически соткали? Вероятно, это связано с тем, как Tomcat загружает классы, они развернуты одинаково?

3 голосов
/ 12 октября 2011

Как насчет ткачества во время загрузки Tomcat?Я думаю, что это лучший способ.Я успешно использую его с Tomcat 6/7.
http://static.springsource.org/spring/docs/2.0.x/reference/orm.html#orm-jpa
Глава
"12.6.1.3.1. Настройка ткачества при загрузке Tomcat (5.0 +)"

3 голосов
/ 16 февраля 2011

Убедитесь, что вы добавили агент EclipseLink к jvm, используя параметр jvm

-javaagent:eclipselink.jar 

Для получения дополнительной информации, пожалуйста, ознакомьтесь с документацией EclipseLink

1 голос
/ 21 августа 2013

Вот полное решение для включения динамического плетения в вашем проекте, а также показано, как включить статическое плетение.

...