Не могу понять предупреждение EclipseLink - PullRequest
18 голосов
/ 27 ноября 2011

Я использую EclipseLink 2.3.1 для моделирования самоссылающейся таблицы с помощью JPA 2. При создании EntityManager я получаю странное предупреждение от 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.

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

Я новичок в JPA, так что это может быть глупо. Моя программа действительно проста. Вот определение сущности:

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

Вот файл 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>

Код, который вызывает это предупреждение:

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

Обратите внимание, что полученная ЭМ в порядке и может использоваться (например) для поиска элементов. Кроме того, я могу просматривать граф сущностей - я могу найти одну сущность в базе данных, а затем получить другую сущность, используя поле redirectID.

1 Ответ

20 голосов
/ 27 ноября 2011

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

Чтобы ленивая выборка была возможна для ассоциаций XxxToOne, необходимо изменить байт-код сущностей JPA (это означает, что ткачество). Если он не изменен, ассоциация XxxToOne может быть только извлечена с нетерпением.

Активная загрузка означает, что каждый раз, когда вы загружаете Site из базы данных, его redirectID также загружается. При отложенной выборке вы загружаете сайт, и его перенаправление загружается (лениво) только при вызове метода в поле redirectID.

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