java - 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
抛出InvalidDataAccessApiUsageException
:Can 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
知道如何解决这个问题吗?:/
解决方案
推荐阅读
- java - 使用 gradle 和 JUnit5 进行 ByteBuddy 代理测试
- javascript - Discord.js awaitMessages 不返回任何内容并阻止代码
- pattern-matching - 如何修复 TypeError:调用的匹配模式必须是 Python 3.10 中的类型
- python - 我用 Unity 构建了一个游戏。如何使用python玩这个游戏?
- react-native - React Native - 提供全局主题的最佳方式是什么?
- date - 使用字符串类型比较 Go 中的两个日期
- javascript - 按下按钮后在函数中传递表格
- javascript - 如何在 HTML 中设置 INLINE EVENTS 选项
- git - 如何在分叉或镜像仓库中保持所有分支和标签同步?
- ios - 面临 Apple Store Connect 操作错误