You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot词典应用:Word实体与同义词关联实现咨询

解决方案:Word实体自关联实现同义词关系

你的核心问题是没意识到同义词本质是Word实体之间的多对多自关联,不需要额外的Synonyms实体,直接通过自关联就能实现需求。

数据库设计

需要创建一张中间关联表(比如word_synonyms),用来存储单词与同义词的对应关系,表结构如下:

  • word_id:关联主单词的ID
  • synonym_id:关联同义词的ID
    (两个字段都作为外键关联word表的id字段,同时可将这两个字段设为联合主键避免重复关联)

Word实体修改方案

直接在Word类中定义自关联的多对多关系,代码示例:

@Table(name = "Word")
public class Word {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;
    
    @NotBlank(message = "You should add some word here!")
    @Column(name = "spelling")
    private String spelling;
    
    @Column(name = "transcription")
    private String transcription;
    
    @NotBlank(message = "You should add translation here!")
    @Column(name = "translation")
    private String translation;
    
    // 同义词关联:多对多自关联(维护端,负责操作中间表)
    @ManyToMany
    @JoinTable(
        name = "word_synonyms", // 中间表名
        joinColumns = @JoinColumn(name = "word_id"), // 当前Word对应的外键字段
        inverseJoinColumns = @JoinColumn(name = "synonym_id") // 同义词对应的外键字段
    )
    private Set<Word> synonyms = new HashSet<>();
    
    // 双向关联的被维护端,无需操作中间表
    @ManyToMany(mappedBy = "synonyms")
    private Set<Word> synonymOf = new HashSet<>();
    
    @ManyToOne
    @JoinColumn(name = "dictionary_id", referencedColumnName = "id")
    private Dictionary dictionary;
    
    // Getter、Setter方法
    // 注意:toString中不要直接打印synonyms/synonymOf集合,避免循环引用导致栈溢出
}

关键注意事项

  1. 双向关联维护:添加同义词时要同时维护双向关系,保证数据一致性,示例代码:
    public void bindSynonyms(Word wordA, Word wordB) {
        wordA.getSynonyms().add(wordB);
        wordB.getSynonymOf().add(wordA);
    }
    
  2. 避免循环引用:实体的toString、equals、hashCode方法不要直接包含同义词集合,若需返回前端数据,建议用DTO对象封装,只暴露拼写、音标等必要字段。

内容的提问来源于stack exchange,提问作者Jerry598

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 01:35:00