为什么我会收到“在OneToOne或ManyToOne属性上恢复懒惰设置”的警告信息?

3

大家好,祝你们有愉快的一天。在我的Maven项目中,我使用JPA进行后端通信,并使用Eclipse-link。但是当我尝试在我的模型组件上执行懒加载时,我会收到上面的警告信息。我已经将插件添加到pom.xml和persistent.xml中,并且加入了<property name="eclipselink.weaving" value="false"/>,但是我仍然无法解决我的问题。请帮助我解决。下面是我的实体类:

Gdu.java

package com.model;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;


@Entity
@Table(name = "GDU")
@NamedQueries({
@NamedQuery(name = "Gdu.findAll", query = "SELECT g FROM Gdu g"),
@NamedQuery(name = "Gdu.findByGduId", query = "SELECT g FROM Gdu g WHERE g.gduId = :gduId"),
@NamedQuery(name = "Gdu.findByName", query = "SELECT g FROM Gdu g WHERE g.name = :name"),
@NamedQuery(name = "Gdu.findByHttpPort", query = "SELECT g FROM Gdu g WHERE g.httpPort = :httpPort"),
@NamedQuery(name = "Gdu.findByModbusPort", query = "SELECT g FROM Gdu g WHERE g.modbusPort = :modbusPort")})
@SequenceGenerator(name="SEQ5", sequenceName="gduSeq", allocationSize=1)
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@gduId")




 public class Gdu implements Serializable {
        private static final long serialVersionUID = 1L;
        // @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
        @Id
        @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ5")
        @Basic(optional = false)
        @NotNull
        @Column(name = "GDU_ID")
        private BigDecimal gduId;
        @Size(max = 10)
        @Column(name = "NAME")
        private String name;
        @Basic(optional = false)
        @NotNull
        @Column(name = "HTTP_PORT")
        private BigInteger httpPort;
        @Basic(optional = false)
        @NotNull
        @Column(name = "MODBUS_PORT")
        private BigInteger modbusPort;
        @JoinColumn(name = "PLANT_ID", referencedColumnName = "PLANT_ID")
        @ManyToOne(optional = false, fetch = FetchType.LAZY)
        private Plant plantId;
        @OneToMany(mappedBy = "gduId", fetch = FetchType.LAZY)
        private Collection<Inverter> inverterCollection;
        @JoinColumn(name = "GDUTYPE_ID", referencedColumnName = "GDUTYPE_ID")
        @ManyToOne(optional = false,fetch = FetchType.LAZY)
        private Gdutype gdutypeId;

        public Gdu() {
        }

        public Gdu(BigDecimal gduId) {
        this.gduId = gduId;
        }

        public Gdu(BigDecimal gduId, BigInteger httpPort, BigInteger modbusPort) {
        this.gduId = gduId;
        this.httpPort = httpPort;
        this.modbusPort = modbusPort;
        }

        //override equals and hashcode and setters and getters are here
        } 

这里针对plantId和gdutypeId出现了警告。

The warning is :  [EL Info]: 2014-09-05 14:39:14.144--ServerSession(1385008216)--EclipseLink, version: Eclipse Persistence Services - 2.4.0.v20120608-r11652
[EL Warning]: metadata: 2014-09-05 14:39:14.264--ServerSession(1385008216)--Reverting the lazy setting on the OneToOne or ManyToOne attribute [gdutypeId] for the entity class [class com.model.Gdu] since weaving was not enabled or did not occur.
[EL Warning]: metadata: 2014-09-05 14:39:14.264--ServerSession(1385008216)--Reverting the lazy setting on the OneToOne or ManyToOne attribute [plantId] for the entity class [class com.model.Gdu] since weaving was not enabled or did not occur.

请帮助我。谢谢您的帮助。

Here is Inverter and Plant and GduType. Please have a look

package com.model;
//imports are here
@Entity
@Table(name = "GDUTYPE")
@NamedQueries({
    @NamedQuery(name = "Gdutype.findAll", query = "SELECT g FROM Gdutype g"),
    @NamedQuery(name = "Gdutype.findByGdutypeId", query = "SELECT g FROM Gdutype g WHERE g.gdutypeId = :gdutypeId"),
    @NamedQuery(name = "Gdutype.findByProductName", query = "SELECT g FROM Gdutype g WHERE g.productName = :productName"),
    @NamedQuery(name = "Gdutype.findByApiName", query = "SELECT g FROM Gdutype g WHERE g.apiName = :apiName"),
    @NamedQuery(name = "Gdutype.findByApiVersion", query = "SELECT g FROM Gdutype g WHERE g.apiVersion = :apiVersion")})
public class Gdutype implements Serializable {
    private static final long serialVersionUID = 1L;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "GDUTYPE_ID")
    private BigDecimal gdutypeId;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 10)
    @Column(name = "PRODUCT_NAME")
    private String productName;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 10)
    @Column(name = "API_NAME")
    private String apiName;
    @Size(max = 5)
    @Column(name = "API_VERSION")
    private String apiVersion;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "gdutypeId",fetch = FetchType.LAZY)
    private Collection<Gdu> gduCollection;

    public Gdutype() {
    }

    public Gdutype(BigDecimal gdutypeId) {
        this.gdutypeId = gdutypeId;
    }
    public Gdutype(BigDecimal gdutypeId, String productName, String apiName) {
        this.gdutypeId = gdutypeId;
        this.productName = productName;
        this.apiName = apiName;
    }
    //setters and getters ,hashcode,equals
}


package com.model;
@Entity
@Table(name = "INVERTER")
@NamedQueries({
    @NamedQuery(name = "Inverter.findAll", query = "SELECT i FROM Inverter i"),
    @NamedQuery(name = "Inverter.findByInverterId", query = "SELECT i FROM Inverter i WHERE i.inverterId = :inverterId"),
    @NamedQuery(name = "Inverter.findByName", query = "SELECT i FROM Inverter i WHERE i.name = :name"),
    @NamedQuery(name = "Plant.findByNominalPower", query = "SELECT p FROM Plant p WHERE p.nominalPower = :nominalPower")})
@SequenceGenerator(name="SEQ4", sequenceName="inverterSeq", allocationSize=1)
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@inverterId")
public class Inverter implements Serializable {
    private static final long serialVersionUID = 1L;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ4")    
    @Basic(optional = false)
    @NotNull
    @Column(name = "INVERTER_ID")
    private BigDecimal inverterId;
    @Size(max = 45)
    @Column(name = "NAME")
    private String name;
    @Basic(optional = false)
    @NotNull
    @Column(name = "NOMINAL_POWER")
    private double nominalPower;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "inverterId", fetch = FetchType.LAZY)
    private Collection<Mppt> mpptCollection;
    @JoinColumn(name = "PLANT_ID", referencedColumnName = "PLANT_ID")
    @ManyToOne(optional = false, , fetch = FetchType.LAZY)
    private Plant plantId;
    @JoinColumn(name = "PCI_ID", referencedColumnName = "PCI_ID")
    @ManyToOne(" fetch = FetchType.LAZY)
    private Pci pciId;
    @JoinColumn(name = "INVERTERTYPE_ID", referencedColumnName = "IT_ID")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Invertertype invertertypeId;
    @JoinColumn(name = "GDU_ID", referencedColumnName = "GDU_ID")
    @ManyToOne(fetch = FetchType.LAZY)
    private Gdu gduId;
    public Inverter() {  }
}


package com.model;
@Entity
@Table(name = "PLANT")
@NamedQueries({
    @NamedQuery(name = "Plant.findAll", query = "SELECT p FROM Plant p"),
    @NamedQuery(name = "Plant.findByPlantId", query = "SELECT p FROM Plant p WHERE p.plantId = :plantId"),
    @NamedQuery(name = "Plant.findByName", query = "SELECT p FROM Plant p WHERE p.name = :name"),
    @NamedQuery(name = "Plant.findByOperator", query = "SELECT p FROM Plant p WHERE p.operator = :operator"),
    @NamedQuery(name = "Plant.findByCommissioning", query = "SELECT p FROM Plant p WHERE p.commissioning = :commissioning"),
    @NamedQuery(name = "Plant.findByNominalPower", query = "SELECT p FROM Plant p WHERE p.nominalPower = :nominalPower"),
    @NamedQuery(name = "Plant.findByContador", query = "SELECT p FROM Plant p WHERE p.contador = :contador")})
@SequenceGenerator(name="SEQ2", sequenceName="plantSeq", allocationSize=1)
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@plantId")
public class Plant implements Serializable {
    private static final long serialVersionUID = 1L;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ2")
    @Basic(optional = false)
    @NotNull
    @Column(name = "PLANT_ID")
    private BigDecimal plantId;
    @Size(max = 45)
    @Column(name = "NAME")
    private String name;
    @Size(max = 30)
    @Column(name = "OPERATOR")
    private String operator;
    @Column(name = "COMMISSIONING")
    @Temporal(TemporalType.TIMESTAMP)
    private Date commissioning;
    @Basic(optional = false)
    @NotNull
    @Column(name = "NOMINAL_POWER")
    private double nominalPower;
    @Column(name = "CONTADOR")
    private BigInteger contador;
    @Column(name = "LONGITUDE")
    private BigDecimal longitude;
    @Column(name = "LATITUDE")
    private BigDecimal latitude;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "plantId", fetch = FetchType.LAZY)
    private Collection<Sensor> sensorCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "plant", fetch = FetchType.LAZY)
    private Collection<Userplant> userplantCollection;
    @JoinColumn(name = "REPORT_ID", referencedColumnName = "REPORT_ID")
    @ManyToOne( fetch = FetchType.LAZY)
    private Report reportId;
    @JoinColumn(name = "INSTALLATION_ID", referencedColumnName = "INSTALLATION_ID")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Installation installationId;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "plantId", fetch = FetchType.LAZY)
    private Collection<Gdu> gduCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "plantId", fetch = FetchType.LAZY)
    private Collection<Inverter> inverterCollection;

    public Plant() {
    }

    public Plant(BigDecimal plantId) {
        this.plantId = plantId;
    }

    public Plant(BigDecimal plantId, double nominalPower) {
        this.plantId = plantId;
        this.nominalPower = nominalPower;
    }
}

请展示"Inverter"和"Gdutype"的实现。 - Jens
你好Jens,我已经添加了我的植物、逆变器和Gdutype,请看一下并告诉我你的解决方案... - Rasmita patra
认为您的注释不正确?看看这里,了解映射应该是什么样子:http://en.wikibooks.org/wiki/Java_Persistence/OneToMany。 - Jens
你好Jems,能否告诉我错误出在哪里?如果你是指@ManyToOne(" fetch = FetchType.LAZY),抱歉这应该是在Inverter中的@ManyToOne(fetch = FetchType.LAZY)。 - Rasmita patra
1个回答

4
您正在使用OneToMany和ManyToOne映射,同时启用了PlantGduType的延迟加载。这需要对您的POJO进行字节码更改(编织)。
EclipseLink使用编织来增强JPA实体和普通的Java对象(POJO)类,以实现诸如延迟加载、变更跟踪、获取组和内部优化等功能。
EclipseLink使用编织来为POJO类提供以下功能:
  • 延迟加载(间接访问)
  • 变更跟踪
  • 获取组
  • 内部优化
要解决此警告,您有两个选项:
  1. 删除延迟加载。
  2. 配置动态编织
参考:EclipseLink

谢谢您的回答。我认为我需要为我的应用程序创建session.xml文件。我是对的吗?请告诉我。 - Rasmita patra
你好 Barun,如果我删除了 implements Serializable,我认为一切都会没问题。我是对的还是错的? - Rasmita patra
@Rasmitapatra 没有问题。别忘了将其标记为答案。 - Barun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接