Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不使用ORM和直接JDBC(或等效工具)的情况下处理这些常见问题?_Java_Orm_Jdbc_Jakarta Ee - Fatal编程技术网

Java 如何在不使用ORM和直接JDBC(或等效工具)的情况下处理这些常见问题?

Java 如何在不使用ORM和直接JDBC(或等效工具)的情况下处理这些常见问题?,java,orm,jdbc,jakarta-ee,Java,Orm,Jdbc,Jakarta Ee,在使用JDBC时,我通常需要考虑以下问题。我不想太难,只是让一些东西工作,但我想知道,没有ORM或其他库,人们是如何处理这些问题的 快速加载与延迟加载: 您是否只有一个域对象,并且依赖子对象为null,并让调用方负责在需要时调用DAO来加载这些子对象?还是只对同一个域对象使用多个传输对象?这也意味着您必须为急切情况和懒惰情况维护单独的SQL查询 域对象和传输对象: 您甚至需要域对象和传输对象吗?对于上述情况,通过传输对象使用域对象的不同表示可能更容易实现。最后,如果使用传输对象,相关对象会被“分

在使用JDBC时,我通常需要考虑以下问题。我不想太难,只是让一些东西工作,但我想知道,没有ORM或其他库,人们是如何处理这些问题的

  • 快速加载与延迟加载: 您是否只有一个域对象,并且依赖子对象为null,并让调用方负责在需要时调用DAO来加载这些子对象?还是只对同一个域对象使用多个传输对象?这也意味着您必须为急切情况和懒惰情况维护单独的SQL查询

  • 域对象和传输对象: 您甚至需要域对象和传输对象吗?对于上述情况,通过传输对象使用域对象的不同表示可能更容易实现。最后,如果使用传输对象,相关对象会被“分离”吗?换句话说,如果您有一个具有多个子类的类父类,那么父类会有一个子类集合的实例,还是会单独请求这些子类

  • 正在分配id: 到目前为止,我所做的是捆绑一个事务,然后在最后分配id。但是,这需要一个公共函数来设置id

  • 级联: 我想唯一的选择是手动操作

  • 还有更多,但这是我现在所能想到的

    编辑:
    至于我为什么要问这个问题,你知道有些开发团队是如何“害怕”使用ORM的,或者出于任何原因不喜欢ORM(通常是因为他们不理解ORM),所以有时候JDBC是你唯一的选择…

    嗯,底线是每个问题都有不同的解决方案,而适合你的方法将取决于上下文:没有一种适合所有人的方法

    例如,对于数字3,我们有一个表,它为每个类型维护一个唯一的id计数器(每个实体类型一行):当您需要id时,为类型选择当前值,然后在数据库中递增它。这个解决方案很简单,但扩展性不好:如果您想改进它,那么您可以让应用层批量分配这些ID的负载(比如说,每种类型一次分配50个),然后在插入新数据时根据需要分发它们,只有在数据库的池耗尽时才返回数据库。这本质上是一种类似的模拟

    对于第四个,与另一个实体类型有关系的每个实体类(包装单个表的类)负责级联删除等


    归根结底,ORM只是一个抽象,所以如果你仔细看,所有这些问题都已经被库实现者解决了。在这种情况下,你只需要做腿部工作

    好吧,底线是每个问题都有不同的解决方案,适合你的解决方案取决于具体情况:没有一种适合所有人的方法

    例如,对于数字3,我们有一个表,它为每个类型维护一个唯一的id计数器(每个实体类型一行):当您需要id时,为类型选择当前值,然后在数据库中递增它。这个解决方案很简单,但扩展性不好:如果您想改进它,那么您可以让应用层批量分配这些ID的负载(比如说,每种类型一次分配50个),然后在插入新数据时根据需要分发它们,只有在数据库的池耗尽时才返回数据库。这本质上是一种类似的模拟

    对于第四个,与另一个实体类型有关系的每个实体类(包装单个表的类)负责级联删除等


    归根结底,ORM只是一个抽象,所以如果你仔细看,所有这些问题都已经被库实现者解决了。在这种情况下,你只需要做腿部工作

    因此,作为一种扩展,在没有反射和代理等的情况下解决这些问题是可能的,这就是ORM的引擎盖下如何处理大量此类东西?@GreenieMeanie:答案是你可以,但不一定以这样一种通用的方式。我的意思是,你可以为每个问题设计策略并手工实现,但是如果没有这些功能,你很难写出一些通用的东西来完成繁重的工作。如果你使用C++之类的静态语言,你最接近的是代码生成脚本。你的解决方案是获取ID的防弹性吗?select必须确保锁定以防止重复ID,对吗?Oracle有序列,SQLServer有身份密钥,为什么不直接使用它们呢?是的,我肯定会使用DBMS的密钥生成机制以及getGeneratedKeys()。因此,作为扩展,不需要反射和代理等就可以解决这些问题,这就是ORM如何在引擎盖下处理大量此类东西?@GreenieMeanie:答案是你可以,但不一定是以这样一种通用的方式。我的意思是,你可以为每个问题设计策略并手工实现,但是如果没有这些功能,你很难写出一些通用的东西来完成繁重的工作。如果你使用C++之类的静态语言,你最接近的是代码生成脚本。你的解决方案是获取ID的防弹性吗?select必须确保锁定以防止重复ID,对吗?Oracle有序列,SQLServer有身份密钥,为什么不直接使用它们呢?是的,我肯定会使用DBMS的密钥生成机制以及getGeneratedKeys()。这被称为“艰难之路”。-)这叫做“艰难之路”。-)