我应该以什么顺序将对象放到数据库中?

时间:2015-09-26 21:22:01

标签: java mysql hibernate

我在mysql中有数据库,并且使用hibernate连接到java。我有4张桌子:
订单中的1到多个客户 使用OrdersProducts订购1到多个订单 订购产品多达1个产品。
我的客户和产品已经在数据库中。我的程序从用户收集产品和客户端,我想将它们添加到数据库。我需要做的就是:
使用OrderProducts的ArrayList添加订单
- 添加所有订单产品
-update客户端具有新订单的订单ArrayList
使用OrderProduts的ArrayLists更新所有产品

我的问题:
我首先将哪些对象放到数据库中是否重要,如果是,那么什么应该是正确的序列?

我的实体如下:(已编辑)

@Entity
public class Clients implements Serializable {

     @Id
     @GeneratedValue
     private int idClient;
     private String clientName, clientSurname, clientCompany;

     @OneToMany(mappedBy = "clients")
     private List<Orders> listOfOrders = new ArrayList<Orders>();
}

@Entity
public class Orders implements Serializable {

     @Id
     @GeneratedValue
     private int idOrder;
     private double totalAmount;

     @ManyToOne
     @JoinColumn(name = "idClientFK")
     private Clients clients;

     @OneToMany(cascade = CascadeType.ALL, mappedBy = "orders")//, fetch = FetchType.EAGER)
     private List<OrdersProducts> listOfProductsInOrder = new ArrayList<OrdersProducts>();
}

@Entity
public class OrdersProducts implements Serializable {

    @Id
    @GeneratedValue
    private int idOrderProduct;
    private int productAmount;
    private float productsValue;

    @ManyToOne
    @JoinColumn(name = "idOrderFK")
    private Orders orders;

    @ManyToOne
    @JoinColumn(name = "idProductFK")
    private Products products;
}

@Entity
public class Products implements Serializable {

    @Id
    @GeneratedValue
    private int idProduct;
    private String productName;
    private double productValuePerUnit;
    private String productUnit;
    private int productCount;
    private String productCompany;

    @OneToMany(mappedBy = "products")
    private List<OrdersProducts> listOfOrdersProducts = new ArrayList<OrdersProducts>();
  }

1 个答案:

答案 0 :(得分:2)

在数据库中保留新订单的顺序为:

  • 当用户按下新订单按钮时​​:创建一个新的订单实体。

    • 更新与客户的关系。
    • 将其添加到客户端实体中的listOfOrders列表(不需要保留订单)。
  • 当用户向订单添加新产品时:创建OrdersProducts实体。

    • 更新与订单和产品的关系。

    • 将它们添加到订单实体中的listOfProductsInOrder列表。

  • 用户按下结账单时:保留订单实体。

但是,你必须改变:

@OneToMany

由:

@OneToMany(cascade = CascadeType.ALL)
订单实体中的

注意:最好以单数形式给模型实体命名。

修改

好的,我会实现双向关系以提高灵活性:

  • 在您的订单实体中,您应具有与客户实体的ManytoOne关系。

  • 在您的OrdersProducts中,您应该与Orders有一个ManytoOne关系,而对产品有另一个关系。

通常在持久化实体之前更新所有关系。

对于这些双向关系,systax将是:

  • 客户端:

    @Entity
    public class Clients implements Serializable {
    ...
        @OneToMany(fetch = FetchType.EAGER, mappedBy = "idClientFK")
        private List<Orders> listOfOrders = new ArrayList<Orders>();
    }
    
  • 订单:

    @Entity
    public class Orders implements Serializable {
    ...
        @OneToMany(fetch = FetchType.EAGER, mappedBy = "idOrderFK")
        private List<OrdersProducts> listOfProductsInOrder = new ArrayList<OrdersProducts>();
        @JoinColumn (referencedColumnName = "idclient")
        @ManyToOne
        private Clients idClientFK;
    }
    
  • OrdersProducts:

    @Entity
    public class OrdersProducts implements Serializable {
    ...
        @JoinColumn (referencedColumnName = "idorderproduct")
        @ManyToOne
        private Products idProductFK;
        @JoinColumn (referencedColumnName = "idorder")
        @ManyToOne
        private Orders idOrderFK;
    }
    
  • 产品:

    @Entity
    public class Products implements Serializable {
    ...
        @OneToMany(fetch = FetchType.EAGER, mappedBy = "idProductFK")
        private List<OrdersProducts> listOfOrdersProducts = new ArrayList<OrdersProducts>();
    }
    

如果您有双向关系,则可以保留整个Orders实体,或者每次只能保留一个OrdersProducts实体。但是,如果您只有单向关系,则必须持久保存客户端实体,以便为此客户端持久保留一个或多个新订单或已修改的订单。并且相关实体的导航将仅限于父亲与孩子的方向。