гибернация ручного управления строительством объекта - PullRequest
0 голосов
/ 26 сентября 2018

Hibernate предполагает, что все члены объекта взяты из базы данных SQL, которой он отвечает.Что, если какое-то поле объекта, которое не происходит из SQL, например, источником данных является другая база данных NoSQL или просто файл.

    class A {
        public B b;
        public A(int bId) {
            //b object is in an self defined cache which the 
            //data source is not SQL beneath hibernate
            b = CacheOfB.get(bId); 
        }
    }

    class B {
        int id;
        int other_property;
    }

Поэтому, если я добавлю @Embeddable в B, пусть таблица A содержитполе b_id, hibernate не сможет инициировать член b в A.

Кажется, что нет способа самостоятельно определить конструктор, однако, это может быть сделано с помощью двухфазной конструкции, например:

class A {
    @Transient
    public B b;
    @Column(name="b_id")
    private int bId;
    void initMemberB() {
        this.b = CacheOfB.get(bId);
    }
}
A a = session.get(A.class, aId);
a.initMemberB();

Но это уродливо, так что, лучшее решение?

1 Ответ

0 голосов
/ 26 сентября 2018

Я нашел аннотацию jpa @PostLoad, @PrePersist работает.

class A {
    @Transient
    public B b;
    @Column(name="b_id")
    private int bId;
    @PostLoad
    private void initMemberB() {
        this.b = CacheOfB.get(bId);
    }
    @PrePersist
    private void setBId() {
        this.bId = this.b.id;
    }
}
A a = session.get(A.class, aId);
assert a.b.id == a.bId;

Тем не менее, это все же двухфазная конструкция, однако шаги скрыты.Я думаю, что это лучшее, что может сделать jpa / hibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...