小编fyl*_*eow的帖子

如何在Hibernate中优化获取多个集合?

我正在尝试使用Hibernate来提高应用程序的性能,Hibernate正在对数据库执行过多的SQL调用.我认为数据获取可以组合在一起以减少调用并提高性能,但我在这里有点不知所措.我看过关于子选择和批量提取的Hibernate文档,这确实有帮助,但我不认为它完全消除了这个问题.

在下面的示例中,我需要获取属于部队的士兵列表的详细信息并将其显示在网页上.

@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public List<Soldier> getSoldiers() {
   ...
}
Run Code Online (Sandbox Code Playgroud)

很容易将获取策略设置为subselect,batch或eager,以便在没有太多SQL语句的情况下检索此队伍中的所有士兵.

@Entity
public class Soldier {
    @Id
    String soldierId

    String firstName;
    String lastName;

    @OneToMany(mappedBy="address")
    public List<Soldier> getAddress() {
     ...
    @OneToMany(mappedBy="combatHistory")
    public List<Soldier> getCombatHistory() {
      ...
    @OneToMany(mappedBy="medicalHistory")
    public List<Soldier> getMedicalHistory() {
      ...
}
Run Code Online (Sandbox Code Playgroud)

每个士兵实体与其他懒惰加载的实体有多个一对多的关系.我需要初始化这些集合并从中检索值.如果士兵有3对一对多的关系,而且一支部队有1000名士兵,那将导致3 x 1,000个SQL呼叫!

有没有办法通过减少通话次数来优化这一点?既然我已经知道我需要检索的士兵,我可以检索实体并让它们在第一级缓存中可用吗?

例如,我可以查询

from Address as a where a.soldierId in (...)
from CombatHistory as a where a.soldierId in (...)
from MedicalHistory as a where a.soldierId in (...)
Run Code Online (Sandbox Code Playgroud)

如果可以缓存Address,CombatHistory等实体,那么在每个士兵中访问集合时将不会执行SQL选择.这将减少每个集合一个呼叫的数量(在这种情况下为3个),而不是每个战士每个集合一个(3 x 1000)

我在文档中没有真正看到关于解决这个问题的内容,因此非常感谢任何提示和想法.请记住,由于这些集合是列表而不是集合,因此无法在多个集合上执行左连接提取,或者Hibernate将返回异常.

HibernateException: …
Run Code Online (Sandbox Code Playgroud)

optimization hibernate

5
推荐指数
1
解决办法
6667
查看次数

自定义Flex ComboBox,根据用户输入过滤数据提供者

我有一个ComboBox,数据提供者是一个3个值的ArrayCollection:CA - 加州,纽约 - 纽约,德克萨斯州 - 德克萨斯州.使用默认行为,当我开始在ComboBox中输入时,它将尝试匹配字符串开头的值,因此如果我开始键入TX,它将调出TX - Texas.

我希望能够搜索字符串的任何部分,而不仅仅是从头开始,所以如果我输入"xas",它将过滤掉选择并仅显示TX - Texas.有一个非常有用的帖子在Adobe论坛在这里就如何通过改变其组合框提供的数据中的ArrayCollection过滤功能做到这一点,我已经适应了,但我有它一个轻微的问题.

如果用户选择一个值,然后尝试输入新文本,则ComboBox中键入的第一个字母不会显示.

1)在ComboBox中选择值CA - California
2)突出显示文本并在键盘上单击"n"
3)您可能会看到文本框中填充了"n",但文本框仍为空

可能导致此问题的原因是什么?只有在您已选择值时才会发生这种情况.如果你从一个空白的ComboBox开始,它按预期工作.

<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.events.FlexEvent;

        import spark.events.TextOperationEvent;

        [Bindable]
        public var arrC:ArrayCollection = new ArrayCollection([{label:'CA - California'},{label:'NY - New York'},{label:'TX - Texas'}]);

        private function changeHandler(e:*):void
        {
            if (arrC.filterFunction != doFilter)
                arrC.filterFunction = doFilter;
            arrC.refresh();
        }

        private function doFilter(item:Object):Boolean
        {
            if(String(item.label).toLowerCase().indexOf(cb.textInput.text.slice(0 ,cb.textInput.selectionAnchorPosition).toLowerCase())>-1)             
            {
                return true;
            }
            return false;
        }                       

        protected function application1_creationCompleteHandler(event:FlexEvent):void
        {
            cb.textInput.addEventListener(TextOperationEvent.CHANGE,changeHandler );
        }

    ]]>
</fx:Script>

<s:ComboBox id="cb" …
Run Code Online (Sandbox Code Playgroud)

apache-flex adobe actionscript flex4

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