Hibernate 多对多关系jpa中的补充属性
我有个小问题。我尝试将与pojo和jpa的关系表示为以下映射:Hibernate 多对多关系jpa中的补充属性,hibernate,jpa,attributes,Hibernate,Jpa,Attributes,我有个小问题。我尝试将与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\u a(PK),id\u b(PK)。 我希望我的建模允许我: 当我从表a或表b中删除项目时,需要通过瀑布删除中间表的元素您应该使用此补充字段和对两个实体的双向引用创建一个中间实体。该实体应通过@m
table A :
id_a (PK)
nom_a
table B :
id_b (PK)
nom_b
intermediate table :
id_a(PK), id_b(PK)
quantity
我的中间表包含一个复合键id\u a(PK),id\u b(PK)。
我希望我的建模允许我:
当我从表a或表b中删除项目时,需要通过瀑布删除中间表的元素您应该使用此补充字段和对两个实体的双向引用创建一个中间实体。该实体应通过
@manytone
关系引用基础实体,基础实体应通过@OneToMany
关系引用该中间实体
如果希望在删除任何连接项时自动删除此中间实体,则应将@OneToMany
引用的级联
属性设置为CascadeType.REMOVE
下面是示例映射(省略了getter和setter):
@实体
公共类FirstEntity实现可序列化{
@身份证
@生成值
私人长id;
@OneToMany(mappedBy=“firstEntity”,cascade=CascadeType.REMOVE)
私有集合中介=新HashSet();
}
@实体
公共类SecondEntity实现可序列化{
@身份证
@生成值
私人长id;
@OneToMany(mappedBy=“secondEntity”,cascade=CascadeType.REMOVE)
私有集合中介=新HashSet();
}
@实体
公共类中介实现了可序列化{
@身份证
@生成值
私人长id;
私人长数量;
@许多酮
@JoinColumn(name=“first\u entity\u id”)
私人第一实体第一实体;
@许多酮
@JoinColumn(name=“第二个实体id”)
私人第二实体第二实体;
}
你的问题是什么?显然,你需要有类来表示JPA中的任何内容,那么你认为这个“额外属性”将存储在哪里?我想存储在新的联接表“中间表”中。我可以创建一个关联类,在其中我将两个表的主键和两个关系为1的supplimentaireS属性放入其中。*两边。但我想让utilser了解JPA的真正原理。我问的是类,而不是表。您不能在Java类中具有与补充属性的M-N关系。。。你可以与一些中间类建立1-N关系,然后再与另一个类建立N-1关系。这个问题在这个网站上被问了很多次。
@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;
}