0

In my project I try yo use Spring data Jpa. My find methods(findById, findAll) works correctly, but delete and save method works with problems. Delete method delete only from duck table. Save doesn't work:

Exception in thread "main" org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find springdata.entities.FrogJpa with id 2; nested exception is javax.persistence.EntityNotFoundException: Unable to find springdata.entities.FrogJpa with id 2

I have 2 entities: Frog and Duck. Every ducks have 1 Frog(OneToOne). There are problems with entities relationship?

There are my entities class:

@Entity
@Table(name = "DUCKS")
public class DuckJpa implements Serializable {
    @Id
    private int id;
    @Column(name = "NAME")
    private String name;
    @Column(name = "FLY")
    private String flyBehavior;
    @Column(name = "QUACK")
    private String quackBehavior;
    @OneToOne(optional = false)
    @JoinColumn(name = "FROG_ID", unique = true, nullable = false, updatable = false)
    private FrogJpa frogJpa;

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setFlyBehavior(String flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(String quackBehavior) {
        this.quackBehavior = quackBehavior;
    }

    public void setFrogJpa(FrogJpa frogJpa) {
        this.frogJpa = frogJpa;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getFlyBehavior() {
        return flyBehavior;
    }

    public String getQuackBehavior() {
        return quackBehavior;
    }

    public FrogJpa getFrogJpa() {
        return frogJpa;
    }

And Frog:

@Entity
@Table(name = "FROGS")
public class FrogJpa {
    @OneToOne(optional = false, mappedBy = "frogJpa")
    private DuckJpa duckJpa;

    @Id
    private int id;
    @Column(name = "name")
    private String name;

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDuckJpa(DuckJpa duckJpa) {
        this.duckJpa = duckJpa;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public DuckJpa getDuckJpa() {
        return duckJpa;
    }
}

My service class:

public interface DuckService {
    List<DuckJpa> findAll();

    Optional<DuckJpa> findById(Integer i);

    DuckJpa save(DuckJpa duckJpa);    

    void delete(DuckJpa duckJpa);
}

And it's implementation:

@Service("springJpaDuckService")
@Transactional
public class DuckServiceImpl implements DuckService {

    @Autowired
    private DuckJpaRepository duckJpaRepository;

    @Transactional(readOnly = true)
    public List<DuckJpa> findAll() {
        return new ArrayList<>(duckJpaRepository.findAll());
    }

    @Override
    public Optional<DuckJpa> findById(Integer i) {
        return duckJpaRepository.findById(i);
    }

    @Override
    public DuckJpa save(DuckJpa duckJpa) {
        duckJpaRepository.save(duckJpa);
        return duckJpa;
    }

    @Override
    public void delete(DuckJpa duckJpa) {
        duckJpaRepository.delete(duckJpa);
    }
petrov.aleksandr
  • 622
  • 1
  • 5
  • 24

1 Answers1

2

Use @OneToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY). For more information please refer What is cascading in Hibernate?