【问题标题】:supplementaire attributes in many to many relationship jpa多对多关系jpa中的补充属性
【发布时间】:2015-08-08 11:03:38
【问题描述】:

我有一个小问题。我尝试将与 pojo 和 jpa 的关系表示为以下映射:

table A :
id_a (PK)
nom_a

table B :
id_b (PK)
nom_b

intermediate table :
id_a(PK), id_b(PK)
quantity

我的中间表包含一个复合键id_a(PK), id_b(PK).

我希望我的建模允许我: 当我从表 a 或表 b 中删除项目时,需要瀑布删除中间表的元素

【问题讨论】:

  • 你的问题是什么?
  • 显然您需要有类来表示 JPA 中的任何内容,那么您认为这个“额外属性”将存储在哪里?
  • 我想存储在新的连接表“中间表”中
  • 我可以创建一个关联类,在其中我将两个表的主键和supplimentaireS attributeS 与两个关系1. * 两侧。但我想利用 JPA 的真正原理。
  • 我问的是 CLASSES,而不是 TABLES。您不能与 Java 类中的补充属性有 M-N 关系......您可以有 1-N 关系,有一些中间类,然后是 N-1 到另一个类。这个网站已经被问过很多次了。

标签: hibernate jpa attributes


【解决方案1】:

您应该使用此补充字段和对两个实体的双向引用创建一个中间实体。此实体应通过@ManyToOne 关系引用基础实体,基础实体应通过@OneToMany 关系引用此中间实体。

@OneToMany 引用的 cascade 属性应设置为 CascadeType.REMOVE,如果您希望在删除任何连接项时自动删除此中间实体。

这是示例映射(省略了 getter 和 setter):

@Entity
public class FirstEntity implements Serializable {
    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "firstEntity", cascade = CascadeType.REMOVE)
    private Set<IntermediateEntity> intermediates = new HashSet<>();
}

@Entity
public class SecondEntity implements Serializable {
    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "secondEntity", cascade = CascadeType.REMOVE)
    private Set<IntermediateEntity> intermediates = new HashSet<>();
}

@Entity
public class IntermediateEntity implements Serializable {
    @Id
    @GeneratedValue
    private Long id;

    private Long quantity;

    @ManyToOne
    @JoinColumn(name = "first_entity_id")
    private FirstEntity firstEntity;

    @ManyToOne
    @JoinColumn(name = "second_entity_id")
    private SecondEntity secondEntity;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多