Hello Guys, I have three class : *BaseEntity, User, DaoCore*
{code:java}package com.game.data.core.entity;
import jakarta.persistence.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime; @MappedSuperclass @Data public abstract class BaseEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) protected Integer id; @Column(name = "created", nullable = false, updatable = false) protected LocalDateTime created; @Column(name = "updated", nullable = false) protected LocalDateTime updated; public BaseEntity() { this.created = LocalDateTime.now(); this.updated = LocalDateTime.now(); }
@PreUpdate public void preUpdate() { this.updated = LocalDateTime.now(); } }{code}
*User* class :
{code:java}package com.game.data.core.entity; import jakarta.persistence.Entity; import lombok.Data; @Entity @Data public class User extends BaseEntity { private String username; private String password; }{code}
{ noformat code:java }// DaoCore Class
package com.game.data.core.dao; import com.game.data.core.entity.BaseEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface DaoCore<T extends BaseEntity,ID extends Integer> extends JpaRepository<T,ID> { }{ noformat code }
And AbstractServiceCRUD :
{ noformat code:java }package com.game.data.core.base; import com.game.data.core.entity.BaseEntity; import com.game.data.core.dao.DaoCore; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.util.ArrayDeque; @Service @Slf4j(topic = "AbstractServiceCRUD") @Transactional(rollbackOn = RuntimeException.class) @RequiredArgsConstructor public class AbstractServiceCRUD<T extends BaseEntity, ID extends Integer> implements ServiceCore<T, ID> { private final DaoCore<T, ID> daoCore; @Override public T save(T bo) { try { log.info("saving data"); return daoCore.save(bo); } catch (Exception e) { log.error("error saving data", e); throw new RuntimeException(e); } }
@Override public T update(T bo, ID id) { try { if (!(id instanceof Integer)) { log.info("id is not instance Integer"); return null; } boolean isExist = daoCore.existsById(id); if (isExist) { log.info("updating data with id: {}", id); bo.preUpdate(); return daoCore.save(bo); } log.info("data with id: {} not found", id); return null; } catch (Exception e) { log.error("error updating data", e); throw new RuntimeException(e); } }
@Override public T delete(T bo) { try { ID id = (ID) bo.getId(); if (id != null) { log.info("deleting data with id: {}", id); daoCore.deleteById(id); return bo; } log.info("data with id: {} not found", id); return null; } catch (Exception e) { log.error("error deleting data", e); throw new RuntimeException(e); } }
@Override public T findById(ID id) { log.info("finding data with id: {}", id); T bo = daoCore.findById(id).orElse(null); if (bo != null) { log.info("data with id: {} found", id); return bo; } return null; }
@Override public ArrayDeque<T> findAll() { log.info("finding all data"); return new ArrayDeque<>(daoCore.findAll()); }
@Override public Page<T> findAll(Pageable pageable) { log.info("finding all data with page {} and size {}", pageable.getPageNumber(), pageable.getPageSize()); return daoCore.findAll(pageable); } }
{ noformat code }
And AbstractControllerCRUD :
{ noformat code:java }package com.game.data.core.base; import com.game.data.core.entity.BaseEntity; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.*; import java.util.ArrayDeque; @RestController @RequiredArgsConstructor public class AbstractControllerCRUD<T extends BaseEntity, ID extends Integer> implements ServiceCore<T, ID>{ @Autowired private AbstractServiceCRUD<T, ID> abstractServiceCRUD; @PostMapping("/insert") @Override public T save(@RequestBody T bo) { return abstractServiceCRUD.save(bo); }
@PostMapping("/update/{id}") @Override public T update( @RequestBody T bo,@PathVariable ID id) { return abstractServiceCRUD.update(bo, id); }
@GetMapping("/delete/{id}") @Override public T delete(@RequestBody T bo) { return abstractServiceCRUD.delete(bo); }
@GetMapping("/find/{id}") @Override public T findById(@PathVariable ID id) { return abstractServiceCRUD.findById(id); }
@GetMapping("/findAll") @Override public ArrayDeque<T> findAll() { return abstractServiceCRUD.findAll(); }
@GetMapping("/findAllPage") @Override public Page<T> findAll(@RequestBody Pageable pageable) { return abstractServiceCRUD.findAll(pageable); } }
{ noformat code }
And class : UserController
{ noformat code:java }package com.game.data.core.endpoint; import com.game.data.core.base.AbstractControllerCRUD; import com.game.data.core.entity.User; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController@RequestMapping("/api/user") public class UserController extends AbstractControllerCRUD<User,Integer> { }{ noformat code }
*When I call to api : /api/user/find/{id} it gives an error :* {color:#bf2600}*org.hibernate.UnknownEntityTypeException: Unable to locate entity descriptor: com.game.data.core.entity.BaseEntity* {color}
*If I call API /api/user/insert it still works, please help me, thanks* |
|