我的应用程序运行方式很奇怪。事实上,在调试时,我可以清楚地看到我的对象被持久化在db上,但在运行模式下,jpa似乎不会持久化它们。以下是源代码中的代码片段:
@Entity
@Table(name = "a", schema="myschema")
public class A implements Serializable{
@Id
@Column(name = "id", unique = true, nullable = false)
@NotNull(message = "id can not be null")
private UUID id = UUID.randomUUID();
@JsonIgnore
// @ManyToMany(fetch = FetchType.EAGER)
@ManyToMany
@JoinTable(name = "a_b", joinColumns = { @JoinColumn(name = "a_id") },
inverseJoinColumns = { @JoinColumn(name = "b_id") }
)
private List<b> blist = new ArrayList<>();
//omitted source code
}
@Entity
@Table(name = "b", schema="myschema")
public class B implements Serializable{
@Id
@Column(name = "id", unique = true, nullable = false)
@NotNull(message = "id can not be null")
private Integer id;
@ManyToMany(mappedBy = "blist")
@JsonIgnore
private List<A> alist = new ArrayList<>();
//omitted source code
}
@Service
public class MyService{
//omitted source code
public Optional<A> createCopy(A source, int bId) {
B b = bRepository.findById(bId);
A copy_ = this.copy(source);
A target = aRepository.save(copy_);
b.getAlist().add(target);
bRepository.save(b);
return Optional.of(target);
}
private A copy(A source){
A target = new A();
//copy one to one from source to target
target.setB(source.getB());
return target;
}
}
调试时我可以看到,打电话给 MyService#createCopy()
方法,新记录将持久化到表中的数据库中 a_b
. 但是,当我运行服务器,然后继续调用 MyService#createCopy()
,中没有其他记录 a_b
得到持久化。
以前有人遇到过这种奇怪的行为吗?如果是的话,请怎么解决?
2条答案
按热度按时间jckbn6z71#
看起来您在服务中没有再次将新列表设置为b objet,这就是为什么您无法在表a\u b中获取记录的原因。更改您的服务如下。
试一次,让我知道它是否有效。
g6ll5ycj2#
我成功地解决了以下问题(感谢@ajit hint):
既然我的问题已经解决了,我仍然不知道真正的问题是什么。闻起来好像这和延迟加载有关。事实上,唯一没有出现问题的情况是当我检查
source#bList
在进行测试之前copy()
. 如果有人能向我澄清这一点,我将不胜感激。