在Spring Boot中延迟初始化获取失败

时间:2019-01-29 17:13:14

标签: spring hibernate spring-boot spring-data-jpa

我在弹簧靴中有下面这些实体

@Entity
@Table(name = "invoice")
public class Invoice {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name = "invoice_id")
    long id;
    String recipient;
    String sender;
    String issueDate;
    boolean isApproved;
    String status;
    String blockchainTx;
    String UUID;
    boolean miningStatus;
    @CreationTimestamp
    private LocalDateTime createDateTime;
    @UpdateTimestamp
    private LocalDateTime updateDateTime;
    @ManyToOne
    @JoinColumn(name = "user_id")
    Users user;
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "invoice")
    List<Item> invoiceItems = new ArrayList<Item>();
    public Invoice() {
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getRecipient() {
        return recipient;
    }

    public void setRecipient(String recipient) {
        this.recipient = recipient;
    }

    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }

    public String getIssueDate() {
        return issueDate;
    }

    public void setIssueDate(String issueDate) {
        this.issueDate = issueDate;
    }

    public boolean isApproved() {
        return isApproved;
    }

    public void setApproved(boolean approved) {
        isApproved = approved;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getBlockchainTx() {
        return blockchainTx;
    }

    public void setBlockchainTx(String blockchainTx) {
        this.blockchainTx = blockchainTx;
    }

    public String getUUID() {
        return UUID;
    }

    public void setUUID(String UUID) {
        this.UUID = UUID;
    }

    public boolean isMiningStatus() {
        return miningStatus;
    }

    public void setMiningStatus(boolean miningStatus) {
        this.miningStatus = miningStatus;
    }

    public LocalDateTime getCreateDateTime() {
        return createDateTime;
    }

    public void setCreateDateTime(LocalDateTime createDateTime) {
        this.createDateTime = createDateTime;
    }

    public LocalDateTime getUpdateDateTime() {
        return updateDateTime;
    }

    public void setUpdateDateTime(LocalDateTime updateDateTime) {
        this.updateDateTime = updateDateTime;
    }

    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }

    public List<Item> getInvoiceItems() {
        return invoiceItems;
    }

    public void setInvoiceItems(List<Item> invoiceItems) {
        this.invoiceItems = invoiceItems;
    }


}

还有

@Entity
@Table(name = "invoice_item")
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "invoice_item_id")
    long id;
    @OneToOne
    @JoinColumn(name = "product_id")
    Product product;
    int quantity;
    double price;
    String currency;
    @OneToOne
    Invoice invoice;
    @CreationTimestamp
    private LocalDateTime createDateTime;
    @UpdateTimestamp
    private LocalDateTime updateDateTime;

    public Item() {
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public Invoice getInvoice() {
        return invoice;
    }

    public void setInvoice(Invoice invoice) {
        this.invoice = invoice;
    }

    public LocalDateTime getCreateDateTime() {
        return createDateTime;
    }

    public void setCreateDateTime(LocalDateTime createDateTime) {
        this.createDateTime = createDateTime;
    }

    public LocalDateTime getUpdateDateTime() {
        return updateDateTime;
    }

    public void setUpdateDateTime(LocalDateTime updateDateTime) {
        this.updateDateTime = updateDateTime;
    }

    public String getCurrency() {
        return currency;
    }

    public void setCurrency(String currency) {
        this.currency = currency;
    }
}

@Entity
public class Product {  
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "product_id")
    long id;
    String SKU;
    String productName;
    String description;
    String currency;
    double price;
    String unit;    
    int stock;
    int tax;
    @ManyToOne
    @JsonIgnore
    private Users user;

    public Product() {
        super();
    }
    public Product(String productName, String description, String currency, double price, String unit, int stock, String SKU, int tax) {
        super();
        this.productName = productName;
        this.description = description;
        this.currency = currency;
        this.price = price;
        this.unit = unit;
        this.stock = stock;
        this.SKU = SKU;
        this.tax = tax;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName) {
        this.productName = productName;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getCurrency() {
        return currency;
    }
    public void setCurrency(String currency) {
        this.currency = currency;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public String getUnit() {
        return unit;
    }
    public void setUnit(String unit) {
        this.unit = unit;
    }
    public int getStock() {
        return stock;
    }
    public void setStock(int stock) {
        this.stock = stock;
    }
    public Users getUser() {
        return user;
    }
    public void setUser(Users user) {
        this.user = user;
    }

    public String getSKU() {
        return SKU;
    }

    public void setSKU(String SKU) {
        this.SKU = SKU;
    }

    public int getTax() {
        return tax;
    }

    public void setTax(int tax) {
        this.tax = tax;
    }
}

和用户

@Entity
@Table(name = "user")
public class Users {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "user_id")
    private int id;
    @Column(name = "email")
    private String email;
    @Column(name = "password")
    private String password;
    @Column(name = "name")
    private String name;
    @Column(name = "last_name")
    @JsonAlias("last_name")
    private String lastName;
    @Column(name = "active")
    private int active;
    @CreationTimestamp
    private LocalDateTime createDateTime;
    @UpdateTimestamp
    private LocalDateTime updateDateTime;
    public Users() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getActive() {
        return active;
    }

    public void setActive(int active) {
        this.active = active;
    }


}

我在打电话

Optional<Invoice> invoice = invoiceRepository.findById(id);

我得到

Unable to evaluate the expression Method threw 'org.hibernate.exception.GenericJDBCException' exception.

在“发票”实体中的“发票项目”数组中。但是插入效果很好。

当我第一次编写它时,它还在做一些奇怪的行为,它工作正常,我完全改变了它完全不起作用的方法,一无所知。

我怀疑这是延迟加载的问题,我也尝试在数组列表中调用size,但是没有运气。

请帮助我。

1 个答案:

答案 0 :(得分:0)

检查以下步骤:

  1. 您的存储库界面标记为@Repository
  2. 您的服务类别标记为@Service
  3. 您的调用方法来获取标记为您的服务类内的记录 @Transactional@Transactional Spring注释将在 方法或没有课程级别)
  4. 愿您获得例外Packet for query is too large
  5. 设置全局max_allowed_pa​​cket
相关问题