相关疑难解决方法(0)

JPA实体经理应该关闭吗?

我有以下方法.

public Profile readUser(String email){
    EntityManager em = EMF.get().createEntityManager();
    return em.find(Profile.class, email);
}
Run Code Online (Sandbox Code Playgroud)

以上是实体经理的用法吗?或者有必要关闭他们?请提出任何建议.

java jpa

73
推荐指数
1
解决办法
7万
查看次数

远程病例中的Lazy/Eager加载策略(JPA)

我遇到了像大多数尝试使用ORM进行远程处理的人一样的LazyLoading异常.在大多数情况下,切换到急切的提取解决了问题(延迟加载/非原子查询/线程安全/ n + 1问题......).但是,如果你正在处理一个非常大的对象图,那么急切的提取也会有缺点.

在大多数用例中不需要加载整个对象图.加载需要的更多数据(或从数据库加载数据并提取所需的子集)感觉很糟糕.

那么有什么替代方法可以解决这类问题(在运行时)?
我见过:

  • 将数据访问依赖项注入域对象,并让对象决定加载延迟或急切:感觉不好!域层应独立于任何服务.域注入也是一项昂贵的操作.域应该是数据访问无知的,应该使用或不使用数据访问.
  • 除了需要更多数据的用例之外,获取所有延迟:看起来更好的性能但这种方式会强制许多客户端=>服务器/数据库往返.懒惰字段的初始化也会遭受痛苦(尝试使用JPA).这种方式不具有通用性,并且受到上述相同的惰性限制.
  • 在Lazy类中封装持久性:更复杂,没有与ORM互操作的最佳实践.膨胀的服务层(这么多"手写"代码感觉很糟糕).
  • 对每个用例使用完整的预测:我们将最终使用SQL并放弃ORM的好处.
  • DTO /虚拟代理层强制执行更多复杂性并使代码更难维护(Wormhole antipattern >> Bloat).

我想了很多其他的方式.也许通用投影white./black listning是一个解决方案.

Idea(黑名单):使用提取操作的边界定义类名列表.如果属性匹配并且它是惰性的,则删除惰性(CGLIB)代理并使用null填充该值.否则,简单地防止获取(并将值保留为null).因此,我们可以在DAO中设置明确的界限.

示例:ProductDao.findByName("Soap",Boundaries.BLACKLIST,"Category, Discount") 最后两个参数也可以绑定到Boundaries对象中.

Idea(白名单):与黑名单一样,但您必须声明属性应加载到白名单中.

您如何看待这样的解决方案?(可能的问题,限制,优点......)我应该如何在java中编写这个?也许通过AOP来匹配DAO方法(因为我能够在那里修改cglib代理行为)?

java orm remoting jpa lazy-loading

10
推荐指数
1
解决办法
6079
查看次数

Netbeans JSR-296,Swing和JavaFX,我们现在打算使用什么?

我开始学习Java开发(我以前用C++开发),我正在使用一些旧的材料,但是,我还想跟上Java的发展和建议.

我做了一些关于Swing和JavaFX的背景研究.我了解到JavaFX脚本的开发已经停止,但FX的第2版正在开发中,所以我不确定这最终会是什么,因为我认为脚本是标准的主要部分.

使用Netbeans时,我发现Swing的进一步开发是停止,Netbeans支持也是如此(JSR-296).Netbeans建议转移到我不愿意做的Netbeans Platform API,因为我想学习Java作为一种真正的跨平台语言而不是与任何细节联系在一起.

这让我想问一下在Java世界中开发GUI的首选新方法是什么?

java swing netbeans javafx jsr296

6
推荐指数
1
解决办法
1867
查看次数

桌面SWING应用程序上的jpa

我正在使用SWING开发单声道用户桌面应用程序.我对使用java.sql api的这种应用程序有一点经验,并且发现它根本不舒服......

在我的新应用程序中,我第一次尝试使用JPA,我已经阅读了很多教程,这些教程让我理解了我所需要的几乎所有东西,但没有找到真正的Java桌面应用程序的好例子.

我正在考虑使用以下架构,但不知道我是否正确......

我想创建一个MyPersistenceUnit类:

    public class MyPersistenceUnit {
        private static EntityManagerFactory factory;
        private static EntityManager entityManager;

        public static void initiate(){
            factory=Persistence.createEntityManagerFactory("PU_Name");
            entityManager=factory.createEntityManager();
        }

        public static EntityManager getEntityManager() {
            return entityManager;
        }

        public static void close(){
            entityManager.close();
            factory.close();
        }

    }
Run Code Online (Sandbox Code Playgroud)

activate()方法将是第一个被调用的方法,并且当应用程序关闭时将调用close()方法.

在应用程序运行时,所有事务都将通过getEntityManager()实例完成,该实例可在应用程序的每个位置访问.如果我对JSE应用程序的理解是正确的,那么获得的实体管理器有一个扩展的持久化上下文,它将使所有实体保持在托管状态,而实体管理器不会被关闭,这就是让我这样思考的原因......

我不知道我是否遗漏了什么,所以任何小费都会受到赞赏

请注意,我正在使用eclipselink提供程序和derby嵌入式数据库.
谢谢

java jpa desktop-application eclipselink

5
推荐指数
2
解决办法
7767
查看次数

Swing和延迟加载组件

我使用Eclipse插件Visual Editor来构建Java Swing接口.由于我不是代码WYSIWYG(UI)编辑器生成的忠实粉丝,我想优化它,当我注意到,编辑器使用延迟加载实现所有元素,如下所示:

private JPanel getSomePanel ()
{
    if ( somePanel == null )
    {
        somePanel = new JPanel();
        // construct the panel
    }
    return somePanel;
}
Run Code Online (Sandbox Code Playgroud)

我知道,当不立即使用有问题的对象时,延迟加载用于获得更好的性能.然而,对于大多数用户界面而言,这没有多大意义,因为例如窗口通常应该从一开始就显示其上的所有组件.在我的情况下也是如此,我有一个相当简单的清晰布局,其中所有组件在显示窗口时都应该存在.

Visual Editor initialize在根容器的构造函数中添加了一个调用,其中构造了根面板并添加了所有其他元素(通过延迟加载).因此,实际上所有组件都是在构造根容器时创建的,只是嵌套在多个方法中.

在这种情况下,是否有任何延迟加载的用途?我应该在哪些UI情况下使用延迟加载?当使用延迟加载时,我实际上甚至允许直接访问成员变量 - 或者我应该每次都调用getter?

谢谢!

java swing lazy-loading

3
推荐指数
1
解决办法
1640
查看次数