2011-11-27 67 views
18

我使用EclipseLink 2.3.1爲JPA 2建模自引用表。 當我創建EntityManager時,我從EclipseLink中得到奇怪的警告。無法理解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(); 

注意,所產生的EM是罰款和能用於(例如)查找元素。 另外,我可以遍歷實體圖 - 我可以在數據庫中找到一個實體,然後使用redirectID字段獲得另一個實體。

回答

20

請參閱http://wiki.eclipse.org/Introduction_to_EclipseLink_Application_Development_%28ELUG%29#Using_Weaving

對於在XxxToOne關聯中進行懶讀取,必須修改JPA實體的字節碼(這就是編織的意思)。如果它未被修改,則只能急於獲取XxxToOne關聯。

提前取指意味着每次從數據庫加載Site時,其加載的redirectID也會加載。通過延遲獲取,您可以加載站點,並且只有在調用redirectID字段上的方法時纔會加載其重定向(延遲)。

+0

謝謝!出於某種原因,我跳過了這個資源。我會看看。 – gamliela

+3

我必須將-javaagent:eclipselink.jar添加到JVM命令行才能使動態編織工作。請參閱http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Performance/Weaving/Dynamic_Weaving – Nathan