Перечисления в в спящем режиме

Проблема заключалась в контексте #{cc} и состоятельности составного атрибута. #{cc} в любом атрибуте вложенных композитных ссылок непосредственно вместо родителя. Атрибут, являющийся stateful, означает, что #{cc} был переоценен в каждом дочернем элементе, который, в свою очередь, в конечном итоге ссылается на себя вместо родителя. Следовательно, переполнение стека. Он оценивает глубину самого себя в бесконечном цикле.

Я обманул статусность атрибута, сделав его безстоящим, используя компонент backing, как показано ниже, который сразу же оценивает его и присваивает ему как свойство компонента:

@FacesComponent("treeComposite")
public class TreeComposite extends UINamingContainer {

    private Integer depth;

    @Override
    public void setValueExpression(String name, ValueExpression binding) {
        if ("depth".equals(name)) {
            setDepth((Integer) binding.getValue(getFacesContext().getELContext()));
        }
        else {
            super.setValueExpression(name, binding);
        }
    }

    public Integer getDepth() {
        return depth;
    }

    public void setDepth(Integer depth) {
        this.depth = depth;
    }

}

, который должен быть объявлен в интерфейсе componentType, как показано ниже:

<cc:interface componentType="treeComposite">
    <cc:attribute name="depth" type="java.lang.Integer" />
</cc:interface>

И в реализации вы должны в тестовой ссылке использовать свойство stateless и вложенную составную ссылку один из родительских (поскольку #{cc} в атрибуте вложенного композита ссылается на сам вложенный композит):

<cc:implementation>
    <br />We're at depth #{cc.depth}.
    <c:if test="#{cc.depth gt 0}">
        <my:tree depth="#{cc.parent.depth - 1}" />
    </c:if>
</cc:implementation>

Я только изменил значение «глубина» здесь, чтобы быть наоборот так что он просто декларативный от клиента без необходимости редактировать его в реализации. Итак, в клиенте вы должны сказать depth="#{3}", если хотите 3 вложенных дочерних элемента:

<my:tree depth="#{3}" />

Обратите внимание на важность того, что это выражение EL, а не буквальное. В противном случае setValueExpression() в компоненте подложки не будет вызываться.

82
задан Antonio 9 February 2011 в 19:59
поделиться

2 ответа

использование в спящем режиме или аннотации JPA:

class User {
   @Enumerated(EnumType.STRING)
   UserType type
}

UserType является просто стандартным перечислением java 5.

я не могу предположить, что это просто ограничено просто аннотациями, но я на самом деле не знаю, как сделать это с hbm файлами. Это может быть очень иждивенец версии, я предполагаю, но я вполне уверен, которые в спящем режиме 3.2 +, требуется.

редактирование: это возможно в hbm, но немного грязно, взгляните на этот поток форума

110
ответ дан Gareth Davis 24 November 2019 в 09:18
поделиться

Из Быть в спящем режиме документации: http://www.hibernate.org/272.html

можно создать новое определение типа для каждого из перечислений и сослаться на определения типов в теге свойства.

Отображение В качестве примера - встроенный <type> тег

  <property name='suit'>
    <type name="EnumUserType">
      <param name="enumClassName">com.company.project.Suit</param>
    </type>
  </property>

Отображение В качестве примера - использование <typedef>

  <typedef name="suit" class='EnumUserType'>
      <param name="enumClassName">com.company.project.Suit</param>
  </typedef>

  <class ...>
    <property name='suit' type='suit'/>
  </class>
15
ответ дан Sirko 24 November 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: