Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jpa-如何创建与IdClass的多对多关系?_Java_Hibernate_Jpa_Many To Many - Fatal编程技术网

Java jpa-如何创建与IdClass的多对多关系?

Java jpa-如何创建与IdClass的多对多关系?,java,hibernate,jpa,many-to-many,Java,Hibernate,Jpa,Many To Many,我有3张具有多对多关系的表 (id、名称等)主键id B(id,名称,…)和主键id AB(id_a,id_b,日期,…)-带有否的关系表 主键 我是否可以为hibernate建模类,以便使用IdClass而不是EmbeddedId解决方案(从而避免使用级联不必要的级别来调用-getId().getA()) PS尝试混合这些解决方案,但无效: 在建立实体之间的关系时,我旁边最近的墙和我的头经常连接在一起。。。(斯蒂芬) 以下是实体a和B之间多对多关系的工作示例: A.java impor

我有3张具有多对多关系的表

  • (id、名称等)主键id
  • B(id,名称,…)和主键id
  • AB(id_a,id_b,日期,…)-带有否的关系表 主键
我是否可以为hibernate建模类,以便使用IdClass而不是EmbeddedId解决方案(从而避免使用级联不必要的级别来调用-getId().getA())

PS尝试混合这些解决方案,但无效:

在建立实体之间的关系时,
我旁边最近的墙和我的头经常连接在一起。。。(斯蒂芬)

以下是实体a和B之间多对多关系的工作示例:

A.java

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class A {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name="id_a")
    private Integer id;

    private String name;

    @OneToMany(mappedBy="a",cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private List<AB> abAssociations = new ArrayList<>();

    // Getters and setters...
}
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class B {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name = "id_b")
    private Integer id;

    private String name;

    @OneToMany(mappedBy = "b", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private List<AB> abAssociations = new ArrayList<>();

    // Getters and setters...
}
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@IdClass(ABid.class)
public class AB {
    @Id
    @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private A a;

    @Id
    @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private B b;

    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

    // Getters and setters...
}
import java.io.Serializable;

// The IdClass MUST implement Serializable and override #hashCode and #equals
public class ABid implements Serializable {

    private static final long serialVersionUID = -2834827403836993112L;

    private A a;
    private B b;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((a == null) ? 0 : a.hashCode());
        result = prime * result + ((b == null) ? 0 : b.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ABid other = (ABid) obj;
        if (a == null) {
            if (other.a != null)
                return false;
        } else if (!a.equals(other.a))
            return false;
        if (b == null) {
            if (other.b != null)
                return false;
        } else if (!b.equals(other.b))
            return false;
        return true;
    }
}
ABid.java

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class A {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name="id_a")
    private Integer id;

    private String name;

    @OneToMany(mappedBy="a",cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private List<AB> abAssociations = new ArrayList<>();

    // Getters and setters...
}
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class B {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name = "id_b")
    private Integer id;

    private String name;

    @OneToMany(mappedBy = "b", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private List<AB> abAssociations = new ArrayList<>();

    // Getters and setters...
}
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@IdClass(ABid.class)
public class AB {
    @Id
    @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private A a;

    @Id
    @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private B b;

    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

    // Getters and setters...
}
import java.io.Serializable;

// The IdClass MUST implement Serializable and override #hashCode and #equals
public class ABid implements Serializable {

    private static final long serialVersionUID = -2834827403836993112L;

    private A a;
    private B b;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((a == null) ? 0 : a.hashCode());
        result = prime * result + ((b == null) ? 0 : b.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ABid other = (ABid) obj;
        if (a == null) {
            if (other.a != null)
                return false;
        } else if (!a.equals(other.a))
            return false;
        if (b == null) {
            if (other.b != null)
                return false;
        } else if (!b.equals(other.b))
            return false;
        return true;
    }
}
pom.xml

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.7.Final</version>
    </dependency>
下面是Hibernate在Postgresql数据库上创建的表的sql代码

CREATE TABLE a
(
  id_a integer NOT NULL,
  name character varying(255),
  CONSTRAINT a_pkey PRIMARY KEY (id_a)
)

CREATE TABLE b
(
  id_b integer NOT NULL,
  name character varying(255),
  CONSTRAINT b_pkey PRIMARY KEY (id_b)
)

CREATE TABLE ab
(
  date timestamp without time zone,
  b_id_b integer NOT NULL,
  a_id_a integer NOT NULL,
  CONSTRAINT ab_pkey PRIMARY KEY (a_id_a, b_id_b),
  CONSTRAINT fk_3exna7nsxvj1kv9i9pntmwlf1 FOREIGN KEY (a_id_a)
      REFERENCES a (id_a) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_n3jrq53nr1elew4rytocopkbu FOREIGN KEY (b_id_b)
      REFERENCES b (id_b) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
回应记者的评论

试试这个:

@Entity
public class AB {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name = "id_ab")
    private Integer id;

    @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private A a;

    @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private B b;

    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

    // Getters and setters...
}

太棒了,谢谢你!(这似乎是一个小问题,如果您不在AB类中为两个字段添加@JoinColumn(name=“a”,nullable=false,updateable=false)注释,a和b)您保存了我的日期:)如果我希望AB类有自己的ID,我该怎么办incremental@valik请看我的回答: