开发者社区 问答 正文

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

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

标签将在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 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";
    }

展开
收起
被纵养的懒猫 2019-09-29 18:08:49 499 分享 版权
阿里云 AI 助理回答

在Java中,处理一对多关系时,通常会使用Hibernate或JPA这样的ORM(对象关系映射)框架。根据您的描述,您希望将用户输入的标签字符串分割,并为每个标签创建一个实体对象,然后将其附加到产品对象的集合中。以下是一个简化的示例,说明如何实现这一过程:

首先,确保您已经定义了Tag实体类,它与Product实体有一对多的关系。

@Entity
public class Tag {
    @Id
    @GeneratedValue
    private Long id;
    private String name;

    // 构造函数、getter和setter省略
}

接下来,在Product类中,您已经有了@OneToMany注解来定义与Tag的关联。为了处理从HTML表单传来的带有空格分隔的标签字符串,您可以在业务逻辑层(例如Service类)中添加一个方法来处理这个转换。

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;
    @Autowired
    private TagRepository tagRepository;

    public Product createProductWithTags(Product product, String tagsAsString) {
        // 分割标签字符串
        String[] tagNames = tagsAsString.split(" ");
        
        // 为每个标签名称查找或创建Tag实体
        Set<Tag> tagSet = new HashSet<>();
        for (String tagName : tagNames) {
            Tag tag = tagRepository.findByName(tagName);
            if (tag == null) {
                // 如果不存在,则创建新的Tag实体
                tag = new Tag();
                tag.setName(tagName);
                tag = tagRepository.save(tag); // 保存新标签到数据库
            }
            tagSet.add(tag);
        }

        // 将标签集合设置到Product实体,并保存Product
        product.setTags(tagSet);
        return productRepository.save(product);
    }
}

这里有几个关键点: 1. 分割字符串:使用split(" ")方法按空格分割输入的标签字符串。 2. 查找或创建标签:遍历每个标签名,尝试从数据库中查找已存在的标签。如果找不到,则创建一个新的Tag实体并保存。 3. 设置标签集合:将所有找到或创建的Tag对象加入到一个HashSet中,以避免重复,并将其设置给Producttags属性。 4. 保存产品:最后,调用productRepository.save(product)保存包含所有标签的产品到数据库。

请确保您的项目中已经配置了数据源、事务管理以及相应的Repository接口(如ProductRepositoryTagRepository),以便执行数据库操作。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: