Java JPA弹簧积垢沉积TransientObject异常
我想用SpringDataJPA管理人员、团队及其成员。 以下测试(当指定一名工作人员时)Java JPA弹簧积垢沉积TransientObject异常,java,spring,hibernate,spring-data-jpa,Java,Spring,Hibernate,Spring Data Jpa,我想用SpringDataJPA管理人员、团队及其成员。 以下测试(当指定一名工作人员时) 使用entityManager.persist(alex)时通过 如果我使用personRepository.save(alex),则引发异常 为什么??在后一种情况下,我得到以下异常: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientObjectException: object ref
entityManager.persist(alex)时通过代码>
personRepository.save(alex),则引发异常代码>
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: hello.data.model.Person; nested exception is java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: hello.data.model.Person
其行为与级联未正确设置一样。但它必须是正确的,因为它与entityManager一起工作
人员安置测试:
@RunWith(SpringRunner.class)
@DataJpaTest
public class PersonRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private PersonRepository personRepository;
@Autowired
private TeamRepository teamRepository;
@Test
public void whenFindOne_thenReturnPerson() {
// given
Person alex = new Person("alex");
entityManager.persist(alex);
entityManager.flush();
// when
Person found = personRepository.findOne(alex.getId());
// then
assertThat(found.getName(), equalToIgnoringWhiteSpace(alex.getName()));
}
@Test
public void whenAddingANewTeamTroughPerson_thenNoException() {
// given
Person alex = new Person("alex");
Team t = new Team("team");
alex.addTeam(t, "integrationTest", new Date());
personRepository.save(alex);
//entityManager.persist(alex);
// when
Person found = personRepository.findOne(alex.getId());
// then
assertThat(found.getTeams().size(), is(1));
}
}
PersonRepository:
public interface PersonRepository extends CrudRepository<Person, Integer> {}
PersonTeamPk:
@Embeddable
public class PersonTeamPk implements java.io.Serializable {
private Person person;
private Team team;
@ManyToOne(cascade = CascadeType.ALL)
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@ManyToOne(cascade = CascadeType.ALL)
public Team getTeam() {
return team;
}
public void setTeam(Team team) {
this.team = team;
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PersonTeamPk that = (PersonTeamPk) o;
if (person != null ? !person.equals(that.person) : that.person != null) return false;
if (team != null ? !team.equals(that.team) : that.team != null)
return false;
return true;
}
public int hashCode() {
int result;
result = (person != null ? person.hashCode() : 0);
result = 31 * result + (team != null ? team.hashCode() : 0);
return result;
}
}
小组:
@实体
公共类团队实现了可序列化、可比较的{
private final IntegerProperty id=新的SimpleIntegerProperty(该“id”);
私有最终StringProperty名称=新SimpleStringProperty(此“名称”);
private Set personTeams=new LinkedHashSet();
公共事务队(s){
此.name.set(s);
}
公共团队(){}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
公共整数getId(){
返回id.get();
}
公共无效集合id(整数id){
此.id.set(id);
}
公共整数属性idProperty(){
返回id;
}
@基本的
@列(name=“name”)
公共字符串getName(){
返回name.get();
}
公共void集合名(字符串名){
this.name.set(name);
}
公共字符串属性nameProperty(){
返回名称;
}
@OneToMany(fetch=FetchType.LAZY,mappedBy=“pk.team”,orphanRemoving=true,cascade=CascadeType.ALL)
公共集getPersonTeams(){
返回人员团队;
}
public void setPersonTeams(Set personTeams){
this.personTeams=personTeams;
}
公共静态回调提取器(){
return(teamp)->新的可观察[]{p.nameProperty()};
}
@凌驾
公共布尔等于(对象o){
如果(this==o)返回true;
如果(o==null | | getClass()!=o.getClass())返回false;
团队=(团队)o;
如果(getId()!=null?!getId().equals(team.getId()):team.getId()!=null)返回false;
如果(getName()!=null?!getName().equals(team.getName()):team.getName()!=null)返回false;
返回true;
}
@凌驾
公共int hashCode(){
int result=id!=null?id.hashCode():0;
result=31*result+(getName()!=null?getName().hashCode():0);
返回结果;
}
@凌驾
公共字符串toString(){
返回name.getValue();
}
@凌驾
公共内部比较(o组){
返回整数.compare(getId(),o.getId());
}
}
@Entity
@Table(name = "person_team")
@AssociationOverrides({
@AssociationOverride(name = "pk.person",
joinColumns = @JoinColumn(name = "PERSON_ID")),
@AssociationOverride(name = "pk.team",
joinColumns = @JoinColumn(name = "TEAM_ID")) })
public class PersonTeam implements java.io.Serializable {
private PersonTeamPk pk = new PersonTeamPk();
private Date createdDate;
private String createdBy;
public PersonTeam() {
}
public PersonTeam(Person person, Team team) {
this.pk.setPerson(person);
this.pk.setTeam(team);
}
@EmbeddedId
public PersonTeamPk getPk() {
return pk;
}
public void setPk(PersonTeamPk pk) {
this.pk = pk;
}
@Transient
public Person getPerson() {
return getPk().getPerson();
}
public void setPerson(Person person) {
getPk().setPerson(person);
}
@Transient
public Team getTeam() {
return getPk().getTeam();
}
public void setTeam(Team team) {
getPk().setTeam(team);
}
@Temporal(TemporalType.DATE)
@Column(name = "CREATED_DATE", nullable = false, length = 10)
public Date getCreatedDate() {
return this.createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
@Column(name = "CREATED_BY", nullable = false, length = 10)
public String getCreatedBy() {
return this.createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
PersonTeam that = (PersonTeam) o;
if (getPk() != null ? !getPk().equals(that.getPk())
: that.getPk() != null)
return false;
return true;
}
public int hashCode() {
return (getPk() != null ? getPk().hashCode() : 0);
}
}
@Embeddable
public class PersonTeamPk implements java.io.Serializable {
private Person person;
private Team team;
@ManyToOne(cascade = CascadeType.ALL)
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@ManyToOne(cascade = CascadeType.ALL)
public Team getTeam() {
return team;
}
public void setTeam(Team team) {
this.team = team;
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PersonTeamPk that = (PersonTeamPk) o;
if (person != null ? !person.equals(that.person) : that.person != null) return false;
if (team != null ? !team.equals(that.team) : that.team != null)
return false;
return true;
}
public int hashCode() {
int result;
result = (person != null ? person.hashCode() : 0);
result = 31 * result + (team != null ? team.hashCode() : 0);
return result;
}
}
@Entity
public class Team implements Serializable, Comparable<Team> {
private final IntegerProperty id = new SimpleIntegerProperty(this, "id");
private final StringProperty name = new SimpleStringProperty(this, "name");
private Set<PersonTeam> personTeams = new LinkedHashSet<>();
public Team(String s) {
this.name.set(s);
}
public Team() {}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public Integer getId() {
return id.get();
}
public void setId(Integer id) {
this.id.set(id);
}
public IntegerProperty idProperty() {
return id;
}
@Basic
@Column(name = "name")
public String getName() {
return name.get();
}
public void setName(String name) {
this.name.set(name);
}
public StringProperty nameProperty() {
return name;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.team", orphanRemoval = true, cascade = CascadeType.ALL)
public Set<PersonTeam> getPersonTeams() {
return personTeams;
}
public void setPersonTeams(Set<PersonTeam> personTeams) {
this.personTeams = personTeams;
}
public static Callback<Team, Observable[]> extractor() {
return (Team p) -> new Observable[]{p.nameProperty()};
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Team team = (Team) o;
if (getId() != null ? !getId().equals(team.getId()) : team.getId() != null) return false;
if (getName() != null ? !getName().equals(team.getName()) : team.getName() != null) return false;
return true;
}
@Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (getName() != null ? getName().hashCode() : 0);
return result;
}
@Override
public String toString() {
return name.getValue();
}
@Override
public int compareTo(Team o) {
return Integer.compare(getId(), o.getId());
}
}