我如何与Spring和百里香建立一对多关系?

问题描述 投票:0回答:3

我想创建一个具有多个“标签”作为集合的“产品”类。因此,一对多数据库,而“产品”为“一个”而“标签”为“许多”。

标签将在HTML中定义为输入字段,并用空格分隔。例如“ tag1 tag2 tag3”。

我现在的问题是:如何从输入字段中检索字符串并将它们作为集合附加到我的产品对象上?

到目前为止我所拥有的:

产品

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

...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";
        }
java spring hibernate thymeleaf boot
3个回答
0
投票
  1. 您必须在服务层中具有一个@Service注释的ProductService类。
  2. 您必须在ProductService类中创建一个以@Transactional注释的方法
  3. 您的方法必须读取产品的所有标签,并将其转换为所需的任何集合。
  4. 请勿在Controller内部执行。做相同的事情实际上是不好的地方。

0
投票

可能您是第一次运行此程序,并且数据库没有名为Tag的表。请确保将hibernate属性hibernate.hbm2ddl.auto设置为'update',它将在进行任何数据插入之前先自动创建所需的表。

对于转换用空格分隔的字符串值标签,只需使用string.split()方法,该方法为您提供数组,然后将其转换为要在Product对象中设置的List。


0
投票

因为标签之间用空格隔开。首先,您需要使用正则表达式制作一个标签的字符串数组,如下所示。

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类的实现@服务公共类TagServiceImpl实现TagService {

    @Autowired
    TagRepository tagRepository;

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

现在按名称获取标签已完成。将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);
}

现在保存产品类别。将此标签列表设置为您的标签。

© www.soinside.com 2019 - 2024. All rights reserved.