java - 为什么我收到类似 : Reverting the lazy setting on the OneToOne or ManyToOne attribute? 的警告信息

标签 java jpa

大家好,

祝你有美好的一天。在我的 Maven 项目中,我使用 JPA 进行后端通信和 eclipse-link。但是,当我尝试在模型组件上执行延迟加载时,我收到了上述警告信息。我已经将插件添加到 pom.xml 中,也在 persist.xml 中添加了插件,但我仍然无法解决我的问题。请任何人帮助我。下面是我的实体类。

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

最佳答案

您正在使用 OneToMany 和 ManyToOne 映射,并在 PlantGduType 上进行延迟加载。这需要对 POJO(编织)进行字节码更改。

EclipseLink 使用编织来增强 JPA 实体和普通旧 Java 对象 (POJO) 类,以实现延迟加载、更改跟踪、获取组和内部优化等功能。

EclipseLink 使用编织为 POJO 类启用以下功能:

  1. 延迟加载(间接)
  2. 更改跟踪
  3. 获取组
  4. 内部优化。

要解决此警告,您有 2 个选择:

  1. 删除延迟加载。
  2. 配置Dynamic weaving

引用:EclipseLink

关于java - 为什么我收到类似 : Reverting the lazy setting on the OneToOne or ManyToOne attribute? 的警告信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25757713/

相关文章:

mysql - 将 Mysql 时间戳日期转换为本地化的 Date 对象

java - Java 中如何检查参数是否指向正确的字段

java - 具有继承性的 JPA 映射 View 和表

java - 如何使用 ADF propertyListener 标记?

java - AES 解密方法错误

java - 传输对象、Spring MVC、架构

java - JPA @NamedQuery 有两个表

java - java中的日期格式不正确

java - Spring项目添加 "spring-boot-starter-data-jpa"依赖时出错

java - 是否可以通过一次测试测试多个类