【问题标题】:How can I model 3 entities with unique constraints and their relationships?如何对具有唯一约束的 3 个实体及其关系进行建模?
【发布时间】:2019-06-08 03:54:48
【问题描述】:

我有 3 个实体类。它们是“游戏”、“游戏描述”、“语言”。 一个游戏可以有很多描述,但最多只能有一个描述与一种语言。例如,一个游戏可以有 2 个描述,一个是英文的,一个是法文的。这个游戏只能有一个英文描述,其他的可以是其他语言。如何使用 Spring Data 和 JPA 在我的 Spring Boot 项目中对此进行建模?

游戏

id/名称/游戏描述

游戏描述

id / game_id / language_id / text

语言

身份证/姓名

我尝试了 Game 和 GameDescription 实体之间的 OneToMany 关系,以及 GameDescription 和 Language 实体之间的 ManyToOne 关系来做这 3 个实体之间的映射。但它没有提供所需的结果。

游戏实体

@Entity
@Table(name="GAME")
public class Game {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "game")
    private List<GameDescription> descriptions;

    // getters and setters
 }

游戏描述实体

@Entity
@Table(name = "GAME_DESCRIPTION")
public class GameDescription {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "GAME_ID")
    private Game game;

    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE,
        CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinColumn(name = "LANG_ID")
    private Language language;

    // getters and setters
}

语言实体

@Entity
@Table(name = "LANGUAGE")
public class Language {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "NAME")
    private String name;

    @Column(name = "LOCAL_NAME")
    private String localName;

    // getters and setters
}

我需要结构精细的这 3 个实体,因为每种语言应该只有一个游戏描述。例如,我希望游戏有 5 种不同语言的描述。

【问题讨论】:

  • 我是否正确假设您正在尝试根据您的实体生成表并且您希望正确定义约束?因为抛开约束,这个设置看起来是正确的。

标签: spring-boot spring-data-jpa h2 one-to-many many-to-one


【解决方案1】:

另一种方法是使用@Embeddable@EmbeddedId 的复合主键。您必须为此修改GameDescription 实体并创建一个带有@Embeddable 注释的新类。像这样的

@Embeddable
public class GameDescriptionId implements Serializable {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "GAME_ID")
    private Game game;

    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE,
    CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinColumn(name = "LANG_ID")
    private Language language;
    // getters, setters, override equals and hashcode
}

然后修改GameDescription实体

@Entity
@Table(name = "GAME_DESCRIPTION")
public class GameDescription {

    @EmbeddedId
    private GameDescriptionId id;
    private String text;
    // getters setters

}

您可以在此处阅读更多信息https://vladmihalcea.com/the-best-way-to-map-a-composite-primary-key-with-jpa-and-hibernate/

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多