我已经在这里读了很多关于同样问题的问题,我可以向你保证,这不是EQUALs方法,而且,它也不是bean范围的问题。所以,让我们看看发生了什么。
我有这个selectOne,正在'部分'
<p:selectOneMenu id="acao" converter="#{acaoConverter}" value="#{prospectoRadarController.acaoSelecionada}">
<f:selectItem itemLabel="#{msg['label.selecione.item']}" itemValue="" />
<f:selectItems var="a" itemValue="#{a}" itemLabel="#{a.descricao}" value="#{acaoController.listarAcoesEmAberto()}" />
</p:selectOneMenu>
所以我有'Acao'实体。所有实体都是完全有效的,因为select的HTML也是正确的(值是实体的正确ID)。
我导入的数据(使用SQL文件)检查最后两行:
INSERT INTO com_acao VALUES (190, 0.00, '2012-12-31', '2012-12-31', '2012-12-31', 'SELECIONADOS 2012-1', 0, 1, 1);
ALTER SEQUENCE com_acao_id_seq RESTART WITH 191;
好的,如果我插入一个新实体,它会正确插入,使用正确的ID,一切正常。
问题:在SelectOneMenu上,如果我选择使用SQL文件导入的实体,它就可以工作。如果我选择一个新实体,我使用系统保存,我得到:
javax.faces.component.UISelectOne.INVALID
验证错误。所以,平等不会被打破。我最好的选择是这与Hibernate有关。但是....它如何添加,过滤,搜索实体,没有错误发生?只发生验证错误? :(
这是实体ID声明:
public class Acao {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
谢谢! 我的存储库是Spring Data的PagingAndSorting接口。我不知道这是否是相关信息...如果你们需要任何信息,请问!再次感谢!
更新 加载要在SelectItems上显示的“Acao”列表的方法:
public List<Acao> listarAcoesEmAberto() {
return acaoService.listarAcoesEmAberto();
}
执行此查询:
@Query("select a from Acao a where a.dataFinal is null OR current_date() <= a.dataFinal")
public List<Acao> listarAcoesEmAberto();
更新2 转换器方法:
@SuppressWarnings("unchecked")
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
if (arg2 == null || arg2.equals("")) {
return null;
}
try {
return baseService.findOne((PK) new SimpleTypeConverter().convertIfNecessary(arg2, ReflectUtil.getPrimaryKeyField(entityClass).getType()));
} catch (TypeMismatchException e) {
return null;
}
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
if (arg2 == null) {
return "";
}
return arg2.toString();
}
注意:这是一个通用的转换器。真正的转换器是:
@Component @Scope( “请求”) 公共类AcaoConverter扩展BaseConverter实现Serializable {
private static final long serialVersionUID = 1L;
@Autowired
public AcaoConverter(AcaoService acaoService) {
super(acaoService, Acao.class);
}
因此它对所有实体都是相同的转换器。它有效。 为什么不对这个特例? :(
更新3 让我们更好地看待问题...
这是sql文件中导入的行:
这是我使用该程序创建的一行:
这在数据库上是相同的(因此它被提交):
这是SELECT:
HTML:
SUCESS CASE(选择导入的行):
ERROR CASE(选择创建的行):
更新4 哇!我测试了一些其他导入的实体,并且...其中一些实际上不起作用。所以,底线:新实体不起作用,一些导入的实体不起作用!查看数据库,它们都是精细的数据,没有任何遗漏或违规。太奇怪了!
另一件事......使用autoComplete组件它可以工作!!!! (一切正常)
答案 0 :(得分:0)
那么,
没有selectOneMenu的解决方案。 所以我使用autoComplete with dropdown(true)。
工作正常。
所以,这不是一个真正的解决方案,而是一种解决方法。 谢谢大家的帮助。