【问题标题】:Use same Entity multiple times in another Entity在另一个实体中多次使用同一个实体
【发布时间】:2021-07-19 16:49:23
【问题描述】:

我正在使用 JPA 和 Hibernate 实现一个 Spring Boot 服务器,其中有 2 个实体:ChannelTranslation

Channel 实体有两个字段(nameTranslationsdescriptionTranslations 应包含法语和英语两种语言的频道名称和描述),其类型为 Translation,如下所述:

班级Channel

@Entity
@Table(name = "CHANNEL")
public class Channel {
  
    @Id
    @Column(name = "ID")
    private String id;

    @OneToOne(mappedBy = "channel", cascade = CascadeType.ALL)
    private Translation nameTranslations;

    @OneToOne(mappedBy = "channel", cascade = CascadeType.ALL)
    private Translation descriptionTranslations;

}

班级Translation

@Entity()
@Table(name = "TRANSLATION")
public class Translation {

    @Id
    @Column(name = "ID")
    private String id;
    
    @Column(length = 1024)
    private String en;
    
    @Column(length = 1024)
    private String fr;

}

我的问题是:如何实现前面描述的逻辑,以便 Channel 类中有 2 个 Translation 字段?到目前为止,我已经使用@OneToOne 注释进行了尝试,但它不起作用。

【问题讨论】:

  • 请提供您要映射的 db 架构的 ER 图。
  • 为什么你的 Channel->Translation 映射中已经映射了?这告诉 JPA 在控制外键的 Channel 实体中有一个“通道”属性 - 但没有。删除它将使 JPA 根据属性名称在通道表中使用默认的 fk 定义,这似乎是您想要的。

标签: mysql hibernate jpa spring-data-jpa


【解决方案1】:

我不确定您要实现哪种映射,但这会起作用:

@Entity
@Table(name = "CHANNEL")
public class Channel {
  
    @Id
    @Column(name = "ID")
    private String id;

    @OneToOne(cascade = CascadeType.ALL)
    private Translation nameTranslations;

    @OneToOne(cascade = CascadeType.ALL)
    private Translation descriptionTranslations;
}

或者,如果您想要其他实体表上的列:

@Entity
@Table(name = "CHANNEL")
public class Channel {
  
    @Id
    @Column(name = "ID")
    private String id;

    @OneToOne(mapped="name", cascade = CascadeType.ALL)
    private Translation nameTranslations;

    @OneToOne(mapped="description", cascade = CascadeType.ALL)
    private Translation descriptionTranslations;
}

@Entity
@Table(name = "TRANSLATION")
public class Translation {

    @Id
    @Column(name = "ID")
    private String id;
    
    @Column(length = 1024)
    private String en;
    
    @Column(length = 1024)
    private String fr;

    @OneToOne
    private Channel name;

    @OneToOne
    private Channel description;
}

请参阅Hibernate ORM documentation for one-to-one associations

【讨论】:

  • 那行不通,因为 JPA 无法分辨哪个翻译是 nameTranslations 哪个是 descriptionTranslations。 FK 需要在通道中,并且翻译端被通道端映射。
  • 啊,我误解了这个问题:-O,我会解决它。
  • @Davide 好的,我正在等待您的更新答复。
  • 我已经更新了我的答案,但我不确定您是在问如何在同一字段上映射两个不同的关联,或者如何在同一实体上映射两个不同的关联。无论如何,我当前答案中的映射应该是更常见的映射
猜你喜欢
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多