【问题标题】:many-to-many relationship with composite key in jpajpa中与复合键的多对多关系
【发布时间】:2015-12-13 23:12:54
【问题描述】:

我使用复合键定义了两个实体之间的多对多关系。 问题是当我得到连接对象时,它只被关系的一侧而不是两侧过滤。

图片让问题更清晰。 我在这里寻找的是 dtid=185 和 prid=352 但我从多对多关系中得到的是两个突出显示的行。

条目 D:

@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "d", orphanRemoval = true)
private List<DP> dp = new ArrayList<DP>();

实体 P:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "p")
private List<DP> dp = new ArrayList<DP>();

PK类:

public class DPPK implements Serializable{

   private Integer d;

   private Integer p;
}

加入:

@IdClass(DPPK.class)
@Entity
@Table(name = "definition_property")
@NamedQueries({
    @NamedQuery(name = "DP.findAll", query = "SELECT d FROM DP d")})
public class DefinitionProperty extends AbstractEntity{

    @Id
    @JoinColumn(name = "dtid", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private D d;
    @Id
    @JoinColumn(name = "prid", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private P p;

    @Column(name = "initial_value")
    @Basic(optional = false)
    private String initialValue;

【问题讨论】:

  • 您没有显示用于尝试获取 dtid=185 和 prid=352 的 DP 的查询。这应该只是 em.find(new DPPK(185, 532)) 的问题。您展示的不是多对多关系,而是两个独立的 1:M 关系。如果您从一端遍历列表,则需要在 1:M 列表中自行搜索您要查找的 DP 实例。

标签: java jpa many-to-many eclipselink


【解决方案1】:

尝试使用嵌入式 ID 来定义复合键,然后尝试过滤掉所需的值。这是来自 StackOverflow 的先前查询,详细说明了如何使用 Embedded Id - How to create and handle composite primary key in JPA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-23
    • 2020-03-03
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2013-02-21
    • 2021-10-10
    • 2015-08-19
    相关资源
    最近更新 更多