初始数据。专业有很多科目。
专业JAVA
@Entity
@Table(name = "specialties")
public class Specialty implements Serializable {
private Long id;
private Set<Subject> subjects;
@Id
@GeneratedValue
@Column(name = "specialty_id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@OneToMany(mappedBy = "specialty")
@Cascade(CascadeType.ALL)
public Set<Subject> getSubjects() {
return subjects;
}
public void setSubjects(Set<Subject> subjects) {
this.subjects = subjects;
}
public void addSubject(Subject subject) {
addSubject(subject, true);
}
public void addSubject(Subject subject, boolean set) {
if (subject != null) {
getSubjects().add(subject);
if (set) {
subject.setSpecialty(this, false);
}
}
}
public void removeSubject(Subject subject) {
getSubjects().remove(subject);
subject.setSpecialty(null);
}
}
对于一个主题来说,专业不能为空。我希望它能以下一种方式工作:当我保存/更新/分离一个主题时,同样的操作必须应用于专业。当我删除一个主题时,专业不会发生任何变化。
主题JAVA
@Entity
@Table(name = "subjects")
public class Subject implements Serializable {
private Long id;
private Specialty specialty;
@Id
@GeneratedValue
@Column(name = "subject_id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@ManyToOne
@JoinColumn(name = "specialty_id")
@Cascade({CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH})
public Specialty getSpecialty() {
return specialty;
}
public void setSpecialty(Specialty specialty) {
setSpecialty(specialty, true);
}
public void setSpecialty(Specialty specialty, boolean add) {
this.specialty = specialty;
if (specialty != null && add) {
specialty.addSubject(this, false);
}
}
}
我写了一个集成测试。生成专业()和生成主题()这只是util方法。
@Before
public void initEntitities() {
specialty = generateSpecialty();
subject = generateSubject();
subject.setSpecialty(specialty);
subjectRepository.save(subject);
entityManager.detach(subject);
}
@Test
public void testSaveSpecialtyViolate2of3UniqueField() {
Subject subject1 = new Subject();
subject1.setSemester(1);
subject1.setUkrName("Тест матан UPD");
subject1.setEngName("XXX");
subject1.setCode("MT 23.O8");
subject1.setCredit(6F);
subject1.setSpecialty(specialty);
subjectService.save(subject1);
assertNotNull(subjectRepository.findOne(subject.getId()));
assertNotEquals(subject.getUkrName(), subject1.getUkrName());
assertEquals(subject.getSemester(), subject1.getSemester());
assertEquals(subject.getSpecialty().getId(),
subject1.getSpecialty().getId());
}
你可以在这张图片上看到测试结果。
subjectService在此处引发了异常。保存(主题1);
原因:org。冬眠PersistentObjectException:传递给Persistent:文凭的分离实体。实体专业
在测试开始时,将分离专业(您可以在图像上看到它。我使用entityManager.contains(专业)来检查它)。我认为问题在于下一步:当Hibernate试图保存subject1时,它首先从db中选择Speciality,Speciality将其状态更改为pesist。你知道我该如何修复它以及为什么会发生吗?
我应用了这个链接中的第一条建议,但对我没有帮助
我认为这可能是因为你在“subject1.setSpecialty(speciality)”中重用了speciality,而在你的“initentities()”中,它可能与主题分离了。
我编写了第一个java应用程序来读取rss流,并使用,,。我的模特<代码>RssFeed: : 和: 我使用处理数据。如果不使用多对多功能保存RssFeed,则可以: 但当我加上一句话: 获取异常:。 我的RssFeedServiceImpl: } 和RssCategoryServiceImpl: 拯救多少对多少?
在我的spring应用程序中,我尝试在数据库中持久化以下实体: 我面临着这个错误: atribute密钥位于Atributo类: 保存操作的处理方式如下: 有人能指出一个正确的方向来维持这个实体吗? 注:项目的完整代码可以在这里找到: https://github.com/klebermo/webapp_horario_livre
我使用的是Spring Boot 4、Hibernate和JPA注释。我遇到了这个错误 组织。冬眠PersistentObjectException:传递给persist的分离实体。 我试着在互联网上搜索,但没有找到正确的答案。我尝试使用而不是,但没有成功。此外,我认为在更新资源时使用。 这是我的代码: ` `积垢服务 ` ` 存储库 ` '抽象存储库 ` ` 工厂` '支持形式 ` ` 控制器
我的课程如下: sportcenter.java service.java 提前道谢!
另外,我有一个IOC托管bean,它内部有一个事务方法。 有2个实体具有单向Many2One-- AuModule在上没有引用
我在尝试使用Spring Data JPA和Hibernate作为JPA提供程序执行批插入操作时遇到了问题。 我有以下方法在我的服务。这就是抛出异常的地方。 Institute是一个实例变量,并提前获取。 我还将实体设置为级联、持久和合并。 为什么这段代码起作用 而此代码不