为什么JPA在这种情况下不生成联接联接表

为什么JPA在这种情况下不生成联接联接表,jpa,jpa-2.0,Jpa,Jpa 2.0,我有两张桌子和两本书,有着多对多的关系。下面给出了两者的代码。现在,当我尝试运行代码时,我得到了错误 异常[EclipseLink-4002]Eclipse持久性服务-2.3.2.v20111125-r10461:org.Eclipse.Persistence.exceptions.DatabaseException 内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表'acme.book_stud'不存在 错误代码:1

我有两张桌子和两本书,有着多对多的关系。下面给出了两者的代码。现在,当我尝试运行代码时,我得到了错误

异常[EclipseLink-4002]Eclipse持久性服务-2.3.2.v20111125-r10461:org.Eclipse.Persistence.exceptions.DatabaseException 内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表'acme.book_stud'不存在 错误代码:1146 调用:将idBooks VALUES?插入到书本中? 绑定=>[2个参数绑定]

似乎JPA正试图写入一个不存在的juction表。在本例中,它假设已经创建了一个连接表,所以它不会创建一个连接表。。如果我为学生们制作一本书,这是可行的,但我不想这样做,因为JPA有责任制作它。有没有一种方法可以让我明确地告诉它创建一个?我在这里做了一个大胆的猜测——但我想当我创建一个持久单位时,我没有指定任何单位,我想这就是为什么它没有创建那个表的原因。我说得对吗?不管怎样,这是我的学生和书本课

图书课

学生班


您在哪里读到JPA负责创建表?不是。你创建你的表,你创建你的实体,你把实体映射到表上。哦,好的。谢谢你指出这一点。如果我创建表格,它工作得非常好。我在读过JPA为您创建的内容后认为,公认的答案是:您绝对不应该创建用户组实体。实体!=表。谢谢你澄清我以为OP是在谈论表,而他实际上是在谈论实体
@Entity
@Table(name = "books")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Books.findAll", query = "SELECT b FROM Books b"),
    @NamedQuery(name = "Books.findByIdBooks", query = "SELECT b FROM Books b WHERE b.idBooks = :idBooks"),
    @NamedQuery(name = "Books.findByBookName", query = "SELECT b FROM Books b WHERE b.bookName = :bookName"),
    @NamedQuery(name = "Books.findByBookType", query = "SELECT b FROM Books b WHERE b.bookType = :bookType")})
public class Books implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "idBooks")
    private String idBooks;
    @Size(max = 45)
    @Column(name = "BookName")
    private String bookName;
    @Size(max = 45)
    @Column(name = "BookType")
    private String bookType;


    /******************************************ADDED **********************/
    @ManyToMany
    @JoinTable(name = "book_stud", 
    joinColumns = { @JoinColumn(name = "idStudents") }, 
    inverseJoinColumns = { @JoinColumn(name = "idBooks") })
    /**************************************ENDED*****************************/


    public Books() {
    }

    public Books(String idBooks) {
        this.idBooks = idBooks;
    }

    public String getIdBooks() {
        return idBooks;
    }

    public void setIdBooks(String idBooks) {
        this.idBooks = idBooks;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getBookType() {
        return bookType;
    }

    public void setBookType(String bookType) {
        this.bookType = bookType;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idBooks != null ? idBooks.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Books)) {
            return false;
        }
        Books other = (Books) object;
        if ((this.idBooks == null && other.idBooks != null) || (this.idBooks != null && !this.idBooks.equals(other.idBooks))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "domain.Books[ idBooks=" + idBooks + " ]";
    }

}
@Entity
@Table(name = "students")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "StudentEnroll.findAll", query = "SELECT s FROM StudentEnroll s"),
    @NamedQuery(name = "StudentEnroll.findByIdStudents", query = "SELECT s FROM StudentEnroll s WHERE s.idStudents = :idStudents"),
    @NamedQuery(name = "StudentEnroll.findByName", query = "SELECT s FROM StudentEnroll s WHERE s.name = :name"),
    @NamedQuery(name = "StudentEnroll.findByRoll", query = "SELECT s FROM StudentEnroll s WHERE s.roll = :roll"),
    @NamedQuery(name = "StudentEnroll.findBySsn", query = "SELECT s FROM StudentEnroll s WHERE s.ssn = :ssn"),
    @NamedQuery(name = "StudentEnroll.findByProgram", query = "SELECT s FROM StudentEnroll s WHERE s.program = :program")})
public class StudentEnroll implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 40)
    @Column(name = "idStudents")
    private String idStudents;
    @Size(max = 45)
    @Column(name = "Name")
    private String name;
    @Column(name = "Roll")
    private Integer roll;
    @Column(name = "SSN")
    private Integer ssn;
    @Size(max = 45)
    @Column(name = "Program")
    private String program;
    @JoinColumn(name = "CustomerID", referencedColumnName = "UserID")
    @ManyToOne
    private Customer customerID;
    //@OneToMany(mappedBy = "studentRoll")
    @OneToMany(mappedBy = "studentRoll",cascade = CascadeType.REMOVE)//added REMOVE
    private Collection<Subject> subjectCollection;



    /**************************ADDED*****************************/
    @ManyToMany
    @JoinTable(name = "book_stud", 
    joinColumns = { @JoinColumn(name = "idBooks") }, 
    inverseJoinColumns = { @JoinColumn(name = "idStudents") })
    /**********************************END**********************/

    public StudentEnroll() {
    }

    public StudentEnroll(String idStudents) {
        this.idStudents = idStudents;
    }

    public String getIdStudents() {
        return idStudents;
    }

    public void setIdStudents(String idStudents) {
        this.idStudents = idStudents;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getRoll() {
        return roll;
    }

    public void setRoll(Integer roll) {
        this.roll = roll;
    }

    public Integer getSsn() {
        return ssn;
    }

    public void setSsn(Integer ssn) {
        this.ssn = ssn;
    }

    public String getProgram() {
        return program;
    }

    public void setProgram(String program) {
        this.program = program;
    }

    public Customer getCustomerID() {
        return customerID;
    }

    public void setCustomerID(Customer customerID) {
        this.customerID = customerID;
    }

    @XmlTransient
    public Collection<Subject> getSubjectCollection() {
        return subjectCollection;
    }

    public void setSubjectCollection(Collection<Subject> subjectCollection) {
        this.subjectCollection = subjectCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idStudents != null ? idStudents.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof StudentEnroll)) {
            return false;
        }
        StudentEnroll other = (StudentEnroll) object;
        if ((this.idStudents == null && other.idStudents != null) || (this.idStudents != null && !this.idStudents.equals(other.idStudents))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "domain.StudentEnroll[ idStudents=" + idStudents + " ]";
    }

}