休眠周期参考



>我的应用程序中有一个一对多和一个多对多关系:

CREATE TABLE IF NOT EXISTS users (
  Id       INT AUTO_INCREMENT,
  Login    VARCHAR(15) UNIQUE NOT NULL,
  Password VARCHAR(20)        NOT NULL
);
CREATE TABLE IF NOT EXISTS products (
  Id    INT PRIMARY KEY AUTO_INCREMENT,
  Name  VARCHAR(30) NOT NULL,
  Price DOUBLE             NOT NULL
);
CREATE TABLE IF NOT EXISTS orders (
  Id     INT PRIMARY KEY AUTO_INCREMENT,
  UserId INT,
  FOREIGN KEY (UserId) REFERENCES users (Id)
);
CREATE TABLE IF NOT EXISTS order_products (
  Order_id   INT,
  Product_id INT,
  FOREIGN KEY (Order_id) REFERENCES orders (Id),
  FOREIGN KEY (Product_id) REFERENCES products (Id)
)

实体:

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Id", unique = true)
    private int Id;
    @Size(min = 3, max = 15)
    @Column(name = "Login", unique = true)
    private String login;
    @NotNull
    @Size(min = 5, max = 20)
    @Column(name = "Password")
    private String password;
    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Order> orders;
}
@Entity
@Table(name = "Orders")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @NotNull
    @Column(name = "Id", unique = true)
    private int id;
    @ManyToOne
    @JoinColumn(name = "UserId")
    private User user;
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "order_products", joinColumns = {@JoinColumn(name = "Order_id")},
            inverseJoinColumns = {@JoinColumn(name = "Product_id")})
    private List<Product> products;
}
@Entity
@Table(name = "products")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @NotNull
    @Column(name = "Id", unique = true)
    private int id;

    @NotNull
    @Size(min = 5, max = 30)
    @Column(name = "Name")
    private String name;

    @NotNull
    @Column(name = "Price")
    private double price;
    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "products")
    private List<Order> orders;
}

如果我尝试访问,例如,用户,它引用订单,然后订单引用用户,最后我得到了一个java.lang.StackOverflowError。

这是由于实体被急切加载而发生的。您需要延迟加载它们,这意味着它不会立即加载所有对象,而是按需加载它们。

您需要更换所有使用的地方

fetch = FetchType.EAGER

fetch = FetchType.LAZY

或者只是删除fetch = FetchType.EAGER,因为fetch = FetchType.LAZY是默认加载机制。

这是一个很好的教程,可以更好地了解不同类型的加载: http://www.baeldung.com/hibernate-lazy-eager-loading

最新更新