Я борюсь с этой ситуацией.
У меня есть объект Threshold, который имеет отношение ManyToMany с объектом ToolCommand, который имеет составной ключ.
public class Threshold{
...
@ManyToMany
private Set<ToolCommand> toolCommands
...
}
public class ToolCommand implements Serializable{
@EmbeddedId
private ToolCommandKey id;
@ManyToMany(mappedBy="toolCommands")
private Set<Threshold> thresholds;
...
}
@Embeddable
public class ToolCommandKey implements Serializable{
@Column(name="tool_id")
private long toolId;
@Column(name="command_id")
private long commandId;
}
Теперь проблема заключается в тимелии, мне нужно предоставить множественный выбор, где вы можете выбрать ToolCommands для Threshold, потому что я не знаю, что добавить в атрибут th:value
для привязки
Не работает, если я так делаю
<select class="form-control" th:field="*{toolCommands}" th:multiple="multiple">
<option th:each="t : ${toolCommands}" th:value="${t.id}" th:text="${t.tool.name + '-' + t.command.name}">Option</option>
</select>
потому что он анализирует t.id как toString ()
Итак, я попытался таким образом
<select class="form-control" th:field="*{toolCommands}" th:multiple="multiple">
<option th:each="t : ${toolCommands}" th:value="${t.id.toolId + ',' + t.id.commandId}"
th:text="${t.tool.name + '-' + t.command.name}">Option</option>
</select>
и добавил форматтер
@Component
public class ToolCommandFormatter implements Formatter<ToolCommand>{
private final Logger logger = LoggerFactory.getLogger(ToolCommandFormatter.class);
@Autowired
private IToolService toolService;
@Autowired
private ICommandService commandService;
@Autowired
private IToolCommandService toolCommandService;
@Override
public String print(ToolCommand object, Locale locale) {
return object.getTool().getToolId() + "," + object.getCommand().getCommandId() ;
}
@Override
public ToolCommand parse(String text, Locale locale) throws ParseException {
logger.debug(text);
String[] ids = text.split(",");
Tool t = toolService.findByToolId(Long.parseLong(ids[0]));
Command c = commandService.finfById(Long.parseLong(ids[1]));
return toolCommandService.findById(t, c);
// return null;
}
Теперь это работает, когда я сохраняю новый порог, но при попытке отредактировать существующий, он не может отрендерить выделение.
Есть ли стандартный способ справиться с этой ситуацией?