首页 > 解决方案 > 实体关系是否正确?

问题描述

在我的项目中,我尝试使用 Spring data Jpa。我的查找方法(findById,findAll)工作正常,但删除和保存方法有问题。删除方法仅从鸭表中删除。保存不起作用:

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

我有 2 个实体:青蛙和鸭子。每只鸭子有 1 只青蛙(OneToOne)。实体关系有问题?

有我的实体类:

@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;
    }

和青蛙:

@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;
    }
}

我的服务等级:

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

    Optional<DuckJpa> findById(Integer i);

    DuckJpa save(DuckJpa duckJpa);    

    void delete(DuckJpa duckJpa);
}

它的实现:

@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);
    }

标签: javaspringspring-data-jpa

解决方案


使用@OneToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY). 有关更多信息,请参阅Hibernate 中的级联是什么?


推荐阅读