問題

我想建立一個“Product”類,其中包含多個“Tags”作為集合.所以一對多數資料庫,而Product是“一”,Tags是“很多”.

標誌將在 HTML 中定義為輸入欄位,並由空格分隔。例如 “tag1 tag2 tag3”。

我現在的問題是:如何從輸入欄位中檢索字串並將其作為集合附加到我的產品物件?

我到目前為止:

產品

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

...Getter & Setter

 

標籤

 @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:我試圖將Tag物件新增為測試,但會丟擲Tag表不存在的錯誤

 @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";
        }
 

  最佳答案

由於您有由空格分隔的標籤.首先,您需要使用正則表示式製作一個標籤的字串陣列,如下所示.

 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);
}
 

現在,當您儲存您的產品類時,將這個標籤列表設定為您的產品類。

  相同標籤的其他問題

javaspringhibernatespring-bootthymeleaf