首页 > 解决方案 > spring jpa manyToMany 复合 @IdClass

问题描述

我有两个实体foo并且bar处于多对多关系中。我为它创建了一个 manyToMany 实体 FooBar,使用它们的主键作为带有 @IdClass 的复合主键 ID:

Foo类:

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

    @Id
    @Column(name="name")
    private String name;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "bar", orphanRemoval = true)
    @NotFound(action = NotFoundAction.IGNORE)
    @JsonIgnoreProperties
    @JsonIgnore
    private List<Foo_bar> fooBars;

    // constructors, getters, setters, ..
}

类酒吧:

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

    @Id
    @Column(name="name")
    private String name;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "foo", orphanRemoval = true)
    @NotFound(action = NotFoundAction.IGNORE)
    @JsonIgnoreProperties
    @JsonIgnore
    private List<Foo_bar> fooBars;

    // constructors, getters, setters, ..
}

类FooBar:

@Entity
@IdClass(FooBarID.class)
@Table(name = "foo_bars")
public class Foo_bar implements Serializable {

    @Id
    @ManyToOne(cascade=CascadeType.MERGE, fetch=FetchType.EAGER)
    private Foo foo;

    @Id
    @ManyToOne(cascade=CascadeType.MERGE, fetch=FetchType.EAGER)
    private Bar bar;

    // constructors, getters, setters, ..
}

类 FooBarId:

public class FooBarID implements Serializable {

    Foo foo;
    Bar bar;

    public FooBarID() {
    }

    public FooBarID(Foo foo, Bar bar) {
        this.foo = foo;
        this.bar = bar;
    }

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

    @Override
    public boolean equals(Object obj) {
        return
                (this.foo == ((FooBarID) obj).foo)
                && (this.bar == ((FooBarID) obj).bar);

    }
}

如果我现在尝试使用 jpa 和代码创建并保存一个新的 FooBar:

Foo foo = this.fooRepository.getByName('foo123').get();
Bar bar = this.barRepository.getByName('bar123').get();

FooBar fooBar = new FooBar();
fooBar.setFoo(foo);
fooBar.setBar(bar);
this.fooBarRepository.save(fooBar); <-- exception

抛出InvalidDataAccessApiUsageExceptionCan not set package.Foo field package.FooBarID.foo to java.lang.String; nested exception is java.lang.IllegalArgumentException: Can not set package.Foo field package.FooBarID.foo to java.lang.String

知道如何解决这个问题吗?:/

标签: javaspringjpamany-to-many

解决方案


推荐阅读