【问题标题】:@OneToMany relationship with non primary key Hibernate@OneToMany 与非主键 Hibernate 的关系
【发布时间】:2025-12-10 08:10:01
【问题描述】:

我有一个 @Entity 叫 Team as

    @Entity
    @Table(name="projects_participants")
    public class Team {

        @Id`enter code here`
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column
        private int id;



    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }


    @Column(name="participants_id")
    private int participants_id;

    public int getParticipants_id() {
        return participants_id;
    }

    public void setParticipants_id(int participants_id) {
        this.participants_id = participants_id;
    }









    /*
    @CollectionOfElements 
    private Set<Projects> projectsParticipant;

    @ManyToMany(fetch = FetchType.LAZY,mappedBy = "team")
    public Set<Projects> getProjectsParticipant() {
        return projectsParticipant;
    }


    public void setProjectsParticipant(Set<Projects> projectsParticipant) {
        this.projectsParticipant = projectsParticipant;
    }
        */
}

我有另一个 bean 名称 Projects 喜欢

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "projects_participants", joinColumns = { 
        @JoinColumn(name = "project_id") }, 
        inverseJoinColumns = { @JoinColumn(name = "participants_id",referencedColumnName="participants_id")})
public Set<Team> getTeam() {
    return team;
}

public void setTeam(Set<Team> team) {
    this.team = team;
}

它工作正常,但问题是 project_participants 表有 project_id 和 Team 表的 id。但我想要 Team 表的 project_id 和 Participants_id。 project_participants 表如下

参与者表格为 *

最后我想要的是表 project_participants 应该有 project_project_idparticipants_id(不是 team_id)。提前谢谢。

【问题讨论】:

    标签: hibernate jakarta-ee entity-relationship one-to-many hibernate-onetomany


    【解决方案1】:

    在我看来,您正在尝试建模 m:n 关系,但没有使用正确的注释和原则。

    1) 将@ManyToMany@JoinTable 结合使用,对m:n 关系进行建模,如jee5 api 中所述。

    2) 不要像 participants_id 那样通过 ID 列模拟与其他对象的关系。使用 JPA,您可以处理对象,而不是它们的 ID,因此您的列将是 Participant

    【讨论】: