当前位置: 首页 > 知识库问答 >
问题:

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

贡和裕
2023-03-14

我有mysql数据库和hibernate与java的连接。我有4个表:
客户1对多订单
订单1对多订单产品
订单产品多对1订单产品
数据库中已经有客户和产品。我的程序从用户那里收集产品和客户端,我想将它们添加到数据库中。我所需要做的就是:
-使用OrderProducts的ArrayList添加订单
-添加所有OrderProducts
-使用新订单更新客户端订单ArrayList
-使用OrderProduts的ArrayList更新所有产品

我的问题是:
我将哪些对象放在数据库的第一位,如果是的话,正确的顺序应该是什么?

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

@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个答案

弓宏茂
2023-03-14

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

>

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

    当用户向订单添加新产品时:创建OrdersProducts实体。

    >

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

    将它们添加到order实体中的listOfProductsInorder列表中。

    用户推式签出订单时:保留订单实体。

    但是,你必须改变:

    @OneToMany
    

    通过:

    @OneToMany(cascade = CascadeType.ALL)
    

    在Orders实体中。

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

    编辑

    好的,我将实现双向关系以增加灵活性:

    >

  • 在您的Orders实体中,您应该与Clients实体有ManytoOne关系。

    在您的订单产品中,您应该与订单有ManytoOne关系,与产品有ManytoOne关系。

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

    对于这些双向关系,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;
    }
    

    订单产品:

    @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实体。但是,如果您只有单向关系,则必须持久化客户端实体,以便持久化此客户端的一个或多个新订单或修改订单。而且,跨相关实体的导航将仅限于父子方向。

  •  类似资料:
    • 我使用Oracle数据库和驱动程序,我使用从ResultSet获取Clob,然后在方法中将其转换为String:

    • 问题内容: 在阅读exploringflask.com时,我了解到最佳实践是使用两个不同的配置文件,一个用于开发,一个用于生产。我不知道是否将密钥放置在开发或生产配置中。 实例文件夹的私有性质使其非常适合用于定义不想在版本控制中公开的键。这些可能包括您应用的秘密密钥或第三方API密钥。 我认为不应共享密钥。我应该将密钥放入开发配置或生产配置中,还是应该为每个配置使用不同的密钥? 问题答案: 将密钥

    • 问题内容: 我已经在Android SDK中看到了AccountManager,它用于存储帐户信息。因此,我找不到任何针对其用途的一般性讨论。有人知道AccountManager的目的是什么以及它能给您带来什么好处吗?对于适合哪种类型的帐户有任何意见?您将在这里将用户的帐户信息用于常规Web服务吗? 问题答案: 这个问题有点老了,但我认为它仍然值得关注。 ,然后一起去。 你不能有一个没有。 你不能

    • 我试图用我使用Gson()提取的POJO填充JTable。使用调试器,或者使用toString()将值打印到控制台,我可以看到对象的映射是成功的。我的问题在于用对象填充自定义Jtable。 问题:我的GUI包含一个按钮,它获取一个搜索字段,并将其发送到一个API,该API返回一个JSON响应,我正确映射了JSON,但我不知道如何将数据放入表中。 我尝试过的:addFillings()和insert

    • 我正在尝试使用HikariCP来共享我的数据库连接。快速阅读他们的文档,我不确定是否应该将我的HikariDataSource对象保留在内存中,并始终向完全相同的对象请求新连接,或者每次创建新连接时是否可以实例化一个新的HikariDataSource对象?

    • 问题内容: 为什么以及何时应该在php中使用该函数?使用后是否应该始终使用它?我读到我必须使用它来防止会话固定,这是唯一原因吗? 问题答案: 什么啊 就像函数名称所说的那样,它是一个函数,它将用新的ID替换当前的会话ID,并保留当前的会话信息。 它有什么作用? 它主要有助于防止会话固定攻击。会话固定攻击是恶意用户试图利用系统中的漏洞固定(设置)另一个用户的会话ID(SID)的地方。这样,他们将拥有