2012-06-11 39 views
1

我需要一次显示大约1300个角色的大表。 (我知道我应该使用数据滚动,但我的用户希望一次看到整个表格。)该表格显示4列。其中两列来自对象,但另外两列来自原始对象中的引用对象。我需要找到最好的/有效的方式来做到这一点。我目前有这个工作,但是当我重新加载表时,它给出了内存不足的错误。我认为这是由内存中大量的冗余数据造成的。JPA和JSF数据表优化

  1. 创建一个视图对象,仓库将只填写所需的字段。
  2. 其他建议。

这里有对象:

public class Database extends EntityObject { 
     private Long id; 
     private String name; 
     private String connectionString; 
     private String username; 
     private String password; 
     private String description; 

     // getter and setters omitted 
    } 

    public class Application extends EntityObject { 
     private Long id; 
     private String name; 
     private String fullName = ""; 
     private String description; 
     private Database database; 
     private List<Role> roles = new ArrayList<Role>(0); 

     // getter and setters omitted 
    } 

    public class Role extends EntityObject { 
     private Long id; 
     private String name; 
     private String nameOnDatabase; 
     private Application application; 

     // getter and setters omitted 
    } 

什么,我需要从角色的列表中显示为:

role.id,role.name,role.application.name,role.application .database.name

回答

1

要明智地进行优化,请定义您将如何处理数据,查看或/和编辑。下面是一些常见的场景

  1. Retrieval using lazy fetch type。 使用FetchType.LAZY批注在应用程序中标记您的角色。

  2. Retrieval using multiselect query。创建您的自定义类(如DTO)并使用多选查询从数据库填充数据。 (类似视图映射为实体)

还有其他的可能性,如Shared (L2) Entity CacheRetrieval by Refresh

看看你是否正确使用EntityManager阅读Am I supposed to call EntityManager.clear() often to avoid memory leaks?

+0

为什么OP要延迟加载? OP的加载“角色”,“应用程序”和“数据库”。 – siebz0r

+0

检索到的角色将加载应用程序,这将加载列表热切。既然您正在从数据库中检索所有角色,我不确定hibernate是否会自动在持久性上下文中查找已检索的角色。 – JMelnik

+0

集合在默认情况下根据我的知识获取。 – siebz0r