Java ManyToMany关系和ManyToMany与另一个类的连接表

Java ManyToMany关系和ManyToMany与另一个类的连接表,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,在没有运气的情况下搜索了很多之后,我决定在这里问我的问题,所以我将从举一个例子来说明问题 我有4门课A-B-C-D 我在a和B之间有很多关系,称为a_B(我知道如何使用@idClass或@Embeddedable和@embeddedId进行编码) 现在我需要的是在a_B和C之间建立一个多个关系,这样我就有了另一个连接表a_B_C A_B_C类也将与D有很多关系,我将得到一个A_B_C_D联接表 如果有人能帮我解决这个问题,我将不胜感激。使用JPA复合pks的一个简单示例可能是: @Entity

在没有运气的情况下搜索了很多之后,我决定在这里问我的问题,所以我将从举一个例子来说明问题

我有4门课A-B-C-D 我在a和B之间有很多关系,称为a_B(我知道如何使用@idClass或@Embeddedable和@embeddedId进行编码)

现在我需要的是在a_B和C之间建立一个多个关系,这样我就有了另一个连接表a_B_C

A_B_C类也将与D有很多关系,我将得到一个A_B_C_D联接表


如果有人能帮我解决这个问题,我将不胜感激。使用JPA复合pks的一个简单示例可能是:

@Entity
class A {
  @Id
  Integer id;
  @OneToMany(mappedBy="a")
  List<AB> abList;
}

@Entity
class B {
  @Id
  Integer id;
  @OneToMany(mappedBy="b")
  List<AB> abList;
}

@Entity
@IdClass(ABId.class)
class AB {
  @Id
  @ManyToOne
  public A a;
  @Id
  @ManyToOne
  public B b;
  @OneToMany(mappedBy="ab")
  List<ABC> abcList;
}

class ABId {
  public Integer a;
  public Integer b;
}

@Entity
@IdClass(ABCId.class)
class ABC {
  @Id
  @ManyToOne
  public AB ab;
  @Id
  @ManyToOne
  public C c;
  @ManyToMany
  List<D> dList;
}

class ABCId {
  public ABId ab;
  public Integer c;
}
@实体
甲级{
@身份证
整数id;
@OneToMany(mappedBy=“a”)
列表列表;
}
@实体
B类{
@身份证
整数id;
@OneToMany(mappedBy=“b”)
列表列表;
}
@实体
@IdClass(阿比德类)
AB类{
@身份证
@许多酮
公共A;
@身份证
@许多酮
公共B B;
@OneToMany(mappedBy=“ab”)
列表abcList;
}
类阿比德{
公共整数a;
公共整数b;
}
@实体
@IdClass(ABCId.class)
ABC班{
@身份证
@许多酮
公共AB;
@身份证
@许多酮
公共C C;
@许多
名单;
}
ABCId类{
公共阿比德ab;
公共整数c;
}

根据@Chris给出的答案,这是我的功能代码

A类:

@Entity
@Table(name = "A")
public class A implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 1L;
private Long idA;
private Set<A_B> a_bs = new HashSet<A_B>();

@Id
@GeneratedValue
@Column(name = "A_ID")
public Long getIdA() {
    return idA;
}
public void setIdA(Long idA) {
    this.idA = idA;
}

@OneToMany(mappedBy = "a", cascade = CascadeType.ALL)
public Set<A_B> getA_bs() {
    return a_bs;
}
public void setA_bs(Set<A_B> a_bs) {
    this.a_bs = a_bs;
}

public void addA_B(A_B a_b){

    this.a_bs.add(a_b);
}

public A() {
    super();
}
}
C类:

@Entity
@Table(name = "B")
public class Matiere implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private Long idB;
private Set<A_B> a_bs = new HashSet<A_B>();

@Id
@GeneratedValue
@Column(name = "B_ID")
public Long getIdB() {
    return idB;
}

public void setIdB(Long idB) {
    this.idB= idB;
}

@OneToMany(mappedBy = "b", cascade = CascadeType.ALL)
public Set<A_B> getA_bs() {
    return a_bs;
}

public void setA_bs(Set<A_B> a_bs) {
    this.a_bs = a_bs;
}

public void addA_B(A_B a_b){

    this.a_bs.add(a_b);
}

public Matiere() {
    super();
    // TODO Auto-generated constructor stub
}
}
@Entity
@Table(name="A_B")
@IdClass(A_BId.class)
public class A_B implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;


private A a;
private B b;
private Set<A_B_C> a_b_cs = new HashSet<A_B_C>();

@Id
@ManyToOne
@JoinColumn(name="A_ID")
public A getA() {
    return a;
}
public void setA(A a) {
    this.a= a;
}

@Id
@ManyToOne
@JoinColumn(name="B_ID")
public B getB() {
    return b;
}
public void setB(B b) {
    this.b= b;
}

@OneToMany(mappedBy="a_b", cascade = CascadeType.ALL)
public Set<A_B_C> getA_b_cs() {
    return a_b_cs;
}
public void setA_b_cs(Set<A_B_C> A_b_cs) {
    this.a_b_cs = a_b_cs;
}
}
public class A_BId implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;

private Long  a;
private Long b;
public Long getA() {
    return a;
}
public void setA(Long a) {
    this.a = a;
}
public Long getB() {
    return b;
}
public void setB(Long b) {
    this.b = b;
}
@Override
public int hashCode() {
    // Code generated here
}
@Override
public boolean equals(Object obj) {
    // Code generated here 
}
@Entity
@Table(name = "C")
public class C implements Serializable {

private static final long serialVersionUID = 1L;
private Long idC;
private Set<A_B_C> a_b_cs = new HashSet<A_B_C>();

@Id
@GeneratedValue
@Column(name = "C_ID")
public Long getIdC() {
    return idC;
}

public void setIdC(Long idC) {
    this.idC= idC;
}

@OneToMany(mappedBy="c", cascade = CascadeType.ALL)
public Set<A_B_C> getA_b_cs() {
    return a_b_cs;
}

public void setA_b_cs(Set<A_B_C> a_b_cs) {
    this.a_b_cs = a_b_cs;
}

public void addABC(A_B_C a_b_c){
    this.a_b_cs.add(a_b_c);
}

public Niveau() {
    super();
}
}
@Entity
@Table(name="A_B_C")
@IdClass(A_B_CId.class)
public class A_B_C implements Serializable{

private static final long serialVersionUID = 1L;
private A_B a_b;
private C c;

@Id
@ManyToOne
@JoinColumns({
    @JoinColumn(name="A_ID", referencedColumnName="A_ID"),
    @JoinColumn(name="B_ID", referencedColumnName="B_ID")
})
public A_B getA_b() {
    return a_b;
}

public void setA_b(A_B a_b) {
    this.a_b = a_b;
}

@Id
@ManyToOne
@JoinColumns({
    @JoinColumn(name="C_ID", referencedColumnName="C_ID")
})
public C getC() {
    return c;
}

public void setC(C c) {
    this.c= c;
}
}
public class A_B_CId implements Serializable {

private static final long serialVersionUID = 1L;
private A_BId a_b;
private Long c;

public A_BId getA_b() {
    return a_b;
}
public void setA_b(A_BId a_b) {
    this.a_b = a_b;
}
public Long getC() {
    return c;
}
public void setC(Long c) {
    this.c= c;
}
public A_B_CId() {
    super();
    // TODO Auto-generated constructor stub
}
@Override
public int hashCode() {
    // Code generated
}
@Override
public boolean equals(Object obj) {
    // Code generated
}
A类\u B\u CId:

@Entity
@Table(name = "B")
public class Matiere implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private Long idB;
private Set<A_B> a_bs = new HashSet<A_B>();

@Id
@GeneratedValue
@Column(name = "B_ID")
public Long getIdB() {
    return idB;
}

public void setIdB(Long idB) {
    this.idB= idB;
}

@OneToMany(mappedBy = "b", cascade = CascadeType.ALL)
public Set<A_B> getA_bs() {
    return a_bs;
}

public void setA_bs(Set<A_B> a_bs) {
    this.a_bs = a_bs;
}

public void addA_B(A_B a_b){

    this.a_bs.add(a_b);
}

public Matiere() {
    super();
    // TODO Auto-generated constructor stub
}
}
@Entity
@Table(name="A_B")
@IdClass(A_BId.class)
public class A_B implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;


private A a;
private B b;
private Set<A_B_C> a_b_cs = new HashSet<A_B_C>();

@Id
@ManyToOne
@JoinColumn(name="A_ID")
public A getA() {
    return a;
}
public void setA(A a) {
    this.a= a;
}

@Id
@ManyToOne
@JoinColumn(name="B_ID")
public B getB() {
    return b;
}
public void setB(B b) {
    this.b= b;
}

@OneToMany(mappedBy="a_b", cascade = CascadeType.ALL)
public Set<A_B_C> getA_b_cs() {
    return a_b_cs;
}
public void setA_b_cs(Set<A_B_C> A_b_cs) {
    this.a_b_cs = a_b_cs;
}
}
public class A_BId implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;

private Long  a;
private Long b;
public Long getA() {
    return a;
}
public void setA(Long a) {
    this.a = a;
}
public Long getB() {
    return b;
}
public void setB(Long b) {
    this.b = b;
}
@Override
public int hashCode() {
    // Code generated here
}
@Override
public boolean equals(Object obj) {
    // Code generated here 
}
@Entity
@Table(name = "C")
public class C implements Serializable {

private static final long serialVersionUID = 1L;
private Long idC;
private Set<A_B_C> a_b_cs = new HashSet<A_B_C>();

@Id
@GeneratedValue
@Column(name = "C_ID")
public Long getIdC() {
    return idC;
}

public void setIdC(Long idC) {
    this.idC= idC;
}

@OneToMany(mappedBy="c", cascade = CascadeType.ALL)
public Set<A_B_C> getA_b_cs() {
    return a_b_cs;
}

public void setA_b_cs(Set<A_B_C> a_b_cs) {
    this.a_b_cs = a_b_cs;
}

public void addABC(A_B_C a_b_c){
    this.a_b_cs.add(a_b_c);
}

public Niveau() {
    super();
}
}
@Entity
@Table(name="A_B_C")
@IdClass(A_B_CId.class)
public class A_B_C implements Serializable{

private static final long serialVersionUID = 1L;
private A_B a_b;
private C c;

@Id
@ManyToOne
@JoinColumns({
    @JoinColumn(name="A_ID", referencedColumnName="A_ID"),
    @JoinColumn(name="B_ID", referencedColumnName="B_ID")
})
public A_B getA_b() {
    return a_b;
}

public void setA_b(A_B a_b) {
    this.a_b = a_b;
}

@Id
@ManyToOne
@JoinColumns({
    @JoinColumn(name="C_ID", referencedColumnName="C_ID")
})
public C getC() {
    return c;
}

public void setC(C c) {
    this.c= c;
}
}
public class A_B_CId implements Serializable {

private static final long serialVersionUID = 1L;
private A_BId a_b;
private Long c;

public A_BId getA_b() {
    return a_b;
}
public void setA_b(A_BId a_b) {
    this.a_b = a_b;
}
public Long getC() {
    return c;
}
public void setC(Long c) {
    this.c= c;
}
public A_B_CId() {
    super();
    // TODO Auto-generated constructor stub
}
@Override
public int hashCode() {
    // Code generated
}
@Override
public boolean equals(Object obj) {
    // Code generated
}

联接表不能有“关系”(假设这是A_B表示的意思)。唯一的方法是有一个中间的A_B实体,然后在A和A_B之间有1-N,在A_B和B之间有N-1,然后把你的关系从A_B实体上挂断是的,我同意你的观点,这正是我所做的我创建了A_B实体,但我的问题是如何在A_B和C之间创建另一个多个关系,我知道我将创建一个a_B_C实体,但下一步怎么办?有解决方案吗?我做了相同的过程,但a_B类有一个复合键,所以我不知道如何将其放入a_B_C关系中感谢您的时间咨询JPA文档,例如,我得到了由以下原因引起的异常:org.hibernate.AnnotationException:com.test.entities.A_B_CId没有持久id属性示例不完整。我不理解Hibernate错误,但是id类应该有一个构造函数并且可以序列化。我添加了一个构造函数,hashcode()和equals()函数,谢谢Chris,你知道如何重命名a_B_C表的连接列吗
@Id@ManyToOne public AB<代码>?你会更新你的代码还是我应该更新我的来选择答案?好的,我解决了问题,我刚刚在ABC类中添加了@JoinColumns({@JoinColumn(name=“A\u ID”,referencedColumnName=“A\u ID”),@JoinColumn(name=“B\u ID”,referencedColumnName=“B\u ID”)}
,我将发布我的功能代码。