Używanie obiektów biznesowych a EntityManager

0

Hej, staram się zrobić u siebie w projekcie (spring boot) obiekty biznesowe, które dostarczałby metod biznesowych do anemicznych encji. Sam pomysł wygląda tak:


@Configurable
public abstract class BusinessObject<T extends Identifiable<K>,K extends Serializable> {

    protected T entity;

    private Class<T> clazz;

    @PersistenceContext
    protected EntityManager entityManager;

    public BusinessObject(@NotNull T entity, Class<T> clazz) {
        this.entity = entity;
        this.clazz = clazz;
    }

    public T attached() {
        return entityManager.find(clazz,entity.getId());
    }

    public K getId(){
        return entity.getId();
    }
}

Użycie EntityManager zamiast repository pozwala uprościć trochę tworzenie tych obiektów (nie trzeba podawać w konstruktorze samego repository tylko klasę co można zrobić z każdego miejsca w projekcie). Do tworzenia obiektów na bazie encji które już istnieją używam:

@Service
public class MatchFinder implements Finder<Match,Long>{

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public Optional<Match> find(Long id) {
        MatchEntity matchEntity = entityManager.find(MatchEntity.class,id);
        if(matchEntity!=null){
            return Optional.of(new Match(matchEntity));
        }
        return Optional.empty();
    }
}

I analogicznie do tworzenia jakiegoś creatora. Problemy jakie z tym mam to, że nie do końca wiem jak sprawić aby EntityManager nie był nullem. W jaki sposób sprawić żeby EntityManager był ustawiony. Czy jest jakiś sensowny sposób na to?

0

Nie za bardzo rozumiem co chcesz zrobić, ale Twój kod wygląda na pogwałcenie OOP a zwłaszcza SPR, obiekt który ma jednocześnie referencję na menagera encji i encję to jakas pomyłka totalna oO

0

Nie lepiej wpiąć Spring Data JPA? Po co samodzielnie obsługiwać EntityManager? Dla mnie dziwny kod.

1

Nie rób tego BusinessObjecta beanem tylko normalna klasą, czyli

  • dodaj parametr do konstruktora:

     public BusinessObject(@NotNull T entity, Class<T> clazz, EntityManager em) {
  • ustaw pole,
  • wywal adnotacje (i tak Ci nie działają).
    I będzie OK.

1 użytkowników online, w tym zalogowanych: 0, gości: 1