Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA弹簧积垢沉积TransientObject异常_Java_Spring_Hibernate_Spring Data Jpa - Fatal编程技术网

Java JPA弹簧积垢沉积TransientObject异常

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

我想用SpringDataJPA管理人员、团队及其成员。 以下测试(当指定一名工作人员时)

  • 使用
    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());
        }
    }