我正在使用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();
请注意,生成的EM很好,可以用(例如)查找元素。 此外,我可以遍历实体图 - 我可以在数据库中找到一个实体,然后使用redirectID字段获得另一个实体。
答案 0 :(得分:20)
请参阅http://wiki.eclipse.org/Introduction_to_EclipseLink_Application_Development_%28ELUG%29#Using_Weaving。
对于在XxxToOne关联上进行延迟提取,必须修改JPA实体的字节代码(这就是编织的意思)。如果没有修改,则只能急切地获取XxxToOne关联。
Eager提取意味着每次从数据库加载Site
时,其redirectID
也会被加载。使用延迟抓取,您加载一个网站,并且只在redirectID
字段上调用方法时才会加载其重定向(懒惰)。