【问题标题】:Java JPA: ManyToMany relationship doesn't workJava JPA:多对多关系不起作用
【发布时间】:2017-03-07 18:54:56
【问题描述】:

我正在使用 JPA 在 IntelliJ 中开发简单的网络应用程序。我有一个包含 3 个表和这些记录的数据库:

Entity1    Entity1_Entity2     Entity2 
 ID:        Ref1:    Ref2:       ID:   
 1           1        2           1
 2           1        1           2

在 Entity1_Entity2 表中也指定了这些关系:
(Ref1) -> Entity1(ID)
(Ref2) -> Entity2(ID)

我使用 JPA 创建了实体 Entity1 和 Entity2:

@Entity
@Table(name = "Entity1")
@Getter
@Setter
public class Entity1 implements Serializable {

    @Id
    @Column(name = "ID")
    private int id;      

    @ManyToMany
    @JoinTable(name = "Entity1_Entity2",
            joinColumns = { @JoinColumn(name = "Ref1") },
            inverseJoinColumns = { @JoinColumn(name = "Ref2") })
    private List<Entity2> list = new ArrayList<>();
}


@Entity
@Table(name = "Entity2")
@Getter
@Setter
public class Entity2 implements Serializable {

       @Id
       @Column(name = "ID")
       private int id;

       @ManyToMany(mappedBy = "list")
       private List<Entity1> otherList = new ArrayList<>();
}

我的问题是当我选择Entity1的一个实例(例如ID=1)并调用entity1.getList()时,它总是返回空引用,但根据数据-应该返回Entity2的2个对象。

尝试将@JoinTable 注释更改为这些值,但没有帮助:

@ManyToMany
@JoinTable(name = "Entity1_Entity2",
         joinColumns = { @JoinColumn(name = "Ref1", referencedColumnName = "ID") },
         inverseJoinColumns = { @JoinColumn(name = "Ref2", referencedColumnName = "ID") })


@ManyToMany
@JoinTable(name = "Entity1_Entity2")


@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "Entity1_Entity2",
            joinColumns = { @JoinColumn(name = "Ref1") },
            inverseJoinColumns = { @JoinColumn(name = "Ref2") })

【问题讨论】:

  • 你在事务中调用 getList() 吗?列出或列出对象是空参考吗?尝试不使用 ArrayList 初始化字段
  • 不,没有交易。它将 null 返回给列表,因为它不会初始化任何列表。也试过不初始化列表,但是没有用。
  • 您在实体上没有 id。没有定义主键。在 db 中找不到该实体。
  • 对不起,我从我的代码复制时忘记包含它们。更新的问题。此外,我已将 ID 定义为两个表的主键。
  • 您可以尝试将 [at]GeneratedValue(strategy = GenerationType.AUTO) 与 [at]Id 一起使用吗?

标签: java jpa intellij-idea many-to-many


【解决方案1】:

我认为您在使用 @Getter@Setter

时遇到问题

因为下一个方法和我一起工作得很好:)

注意:我没有尝试使用 @Getter@Setter

实体1

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name = "Entity1")
public class Entity1 implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "ID")
    private int id;      

    @ManyToMany
    @JoinTable(name = "Entity1_Entity2",
             joinColumns = { @JoinColumn(name = "Ref1", referencedColumnName = "ID") },
             inverseJoinColumns = { @JoinColumn(name = "Ref2", referencedColumnName = "ID") })
    private List<Entity2> list = new ArrayList<>();

    public int getId() {
        return id;
    }

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

    public List<Entity2> getList() {
        return list;
    }

    public void setList(List<Entity2> list) {
        this.list = list;
    }
}

Entity2

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name = "Entity2")
public class Entity2 implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "ID")
    private int id;

    @ManyToMany(mappedBy = "list")
    private List<Entity1> otherList = new ArrayList<>();

    public int getId() {
        return id;
    }

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

    public List<Entity1> getOtherList() {
        return otherList;
    }

    public void setOtherList(List<Entity1> otherList) {
        this.otherList = otherList;
    }

}

它按预期生成了第三个表,其中包含两列(ref1,ref2)

无论如何,我正在使用 JPA 2.1 和 Hibernate 提供程序,所以执行下一个代码会得到你所期望的。

Entity1 entity1 = entityManager.find(Entity1.class, 1);

entity1.getList();

【讨论】:

  • 感谢您的回答。我设法通过在调用 getList() 方法的类中添加“有状态”注释来解决这个问题。不知道它有什么帮助以及这有什么关系。
  • @Edd。 [at]Stateless 或 [at]Stateful 只是给您一个类的实例,它与调用数据库无关,因此例如在上面的类中使用它将允许您使用 [at]EJB YourClassName 实例;不使用 = new YourClassName();因此服务器将在不使用 new 关键字的情况下为您管理实例化实例。
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 2018-04-04
  • 2021-02-05
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多