Как я могу создать отношения один-ко-многим с Spring и thimeleaf? - PullRequest
1 голос
/ 29 сентября 2019

Я хотел бы создать класс «Product», который имеет несколько «Tag» в качестве коллекции.Таким образом, база данных «один ко многим», тогда как «Product» - это «one», а «Tags» - «много».

Теги будут определены в HTML как поле ввода и разделены пробелами.Например, «tag1 tag2 tag3».

Теперь у меня вопрос: как я могу извлечь строку из поля ввода и добавить ее как коллекцию к моему объекту продукта?

Что у меня такfar:

Product

@Entity
public class Product {
    @Id
    @GeneratedValue
    private int barcode;
    public String name;
    @OneToMany(mappedBy = "product", cascade = CascadeType.ALL)
    private Collection<Tag> tags;

...Getter & Setter

Tag

@Entity
public class Tag {
    @Id
    private String tagname;
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "barcode", nullable = false)
    private Product product;

...Getter & Setter

ProductsController: я пытался добавить объекты тегов в качестве теста, но выдает ошибки, что таблица тегов не существует

@PostMapping("/add")
        public String add(@Valid Product product, BindingResult result, Model model) {
            model.addAttribute("responseMessage", result);
            if(!result.hasErrors()) {
//I tried to add a static collection to the product object, but it throws errors
                Collection<Tag> col = new ArrayList<>();
                col.add(new Tag("test"));
                col.add(new Tag("test2"));
                product.setTags(col);

                productRepository.save(product);
            }
            model.addAttribute("products",productRepository.findAll());
            return "products-add";
        }

Ответы [ 3 ]

2 голосов
/ 29 сентября 2019

Поскольку у вас есть теги, разделенные пробелом.Прежде всего вам нужно создать строковый массив тегов с использованием регулярных выражений, как показано ниже.

String tags = "tag1 tag2 tag3";
String[] tagArr = tags.split("\\s+"); 

Теперь вам нужно создать репозиторий, как показано ниже.

@Repository
public interface TagRepository extends JpaRepository<Tag, Long> {
    Tag findByTagname(String tagname);
}

Создать интерфейс дляTagService.

public interface TagService {
    Tag findByTagname(String tagname);
}

Создание реализации класса TagService

@Service
public class TagServiceImpl implements TagService{

    @Autowired
    private TagRepository tagRepository;

    @Override
    public Tag findByTagname(String tagname) {
        return tagRepository.findByTagname(tagname);
    }
}

Теперь выбор Tag по имени завершен.Автоматически подключите ваш TagService к вашему контроллеру класса

@Autowire
private TagService tagService;

Добавьте приведенный ниже код к вашему контроллеру.

String tags = "tag1 tag2 tag3";
String[] tagArr = tags.split("\\s+"); 

List<Tag> tagList = new ArrayList<Tag>();

for (String tagname : tagArr) {
    Tag tag = tagService.findbyTagname(tagname);
    tagList.add(tag);
}

Теперь, когда вы сохраняете свой класс продукта.Установите этот список тегов в ваш it.

0 голосов
/ 29 сентября 2019

Возможно, вы запускаете это впервые, и в вашей базе данных нет таблицы с именем Tag.Пожалуйста, убедитесь, что для свойства hibernate hibernate.hbm2ddl.auto установлено значение «update», которое будет автоматически создавать необходимые таблицы перед выполнением любой вставки данных.

И для преобразования тегов строковых значений, разделенных пробелом, просто используйте строку.Метод split (), который выдает массив, а затем преобразует его в список для установки в объекте Product.

0 голосов
/ 29 сентября 2019
  1. В вашем слое обслуживания должен быть класс ProductService с аннотацией @Service.
  2. Вы должны создать метод с аннотацией @Transactional в классе ProductService
  3. Ваш метод должен прочитать все теги продукта и преобразовать его в любую нужную коллекцию.
  4. Don 'сделать это внутри контроллера.Это на самом деле плохое место, чтобы делать то же самое.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...