powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA много @OneToOne
25 сообщений из 79, страница 2 из 4
JPA много @OneToOne
    #39268082
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1наверное мы по разному видим и понимаем CQRS :)
возможно. Но:
- оракл не делит транзакции на читающие и пишущие. Зачем мне тогда это?
- не понял про необходимость устройства доп.БД _читающей_.
IMHO
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268145
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
только вот забыли основной "кусище" добавить (и здесь колонок не много еще):
автор<sql-result-set-mapping name="BookAuthorMappingXml">
<entity-result entity-class="org.thoughts.on.java.jpa.model.Author">
<field-result name="id" column="authorId"/>
<field-result name="firstName" column="firstName"/>
<field-result name="lastName" column="lastName"/>
<field-result name="version" column="authorVersion"/>
</entity-result>
<entity-result entity-class="org.thoughts.on.java.jpa.model.Book">
<field-result name="id" column="id"/>
<field-result name="title" column="title"/>
<field-result name="author" column="author_id"/>
<field-result name="version" column="version"/>
</entity-result>
</sql-result-set-mapping>

А что там за dirtychecking если вытаскивать для чтения?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268162
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892А что там за dirtychecking если вытаскивать для чтения?
Если вытаскивать в read-only, то dirty checking, как раз не будет.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268266
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Atum1наверное мы по разному видим и понимаем CQRS :)
возможно. Но:
- оракл не делит транзакции на читающие и пишущие. Зачем мне тогда это?
- не понял про необходимость устройства доп.БД _читающей_.
IMHO



Папа все понял... ну это уж совсем классическое описание паттерна.... я же говорил про его идею и маленькую часть....
А так да Там же и cap теорема всплывает и пр.пр...

Нужно Писать классы запросы на dsl языке и исполнять их .... как у с# есть linq язык..... Прада на java реализации счас очень стремная)
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268268
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczno56892А что там за dirtychecking если вытаскивать для чтения?
Если вытаскивать в read-only, то dirty checking, как раз не будет.


Если вытаскивать dto то не будет.... для ридонли там еще нужно посмотреть .... не так все просто.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268283
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Atum1,
только вот забыли основной "кусище" добавить (и здесь колонок не много еще):
автор<sql-result-set-mapping name="BookAuthorMappingXml">
<entity-result entity-class="org.thoughts.on.java.jpa.model.Author">
<field-result name="id" column="authorId"/>
<field-result name="firstName" column="firstName"/>
<field-result name="lastName" column="lastName"/>
<field-result name="version" column="authorVersion"/>
</entity-result>
<entity-result entity-class="org.thoughts.on.java.jpa.model.Book">
<field-result name="id" column="id"/>
<field-result name="title" column="title"/>
<field-result name="author" column="author_id"/>
<field-result name="version" column="version"/>
</entity-result>
</sql-result-set-mapping>

А что там за dirtychecking если вытаскивать для чтения?



Так все это можно и через dto класс описать там же есть пример .


Вы теперь свое чудо решение покажите !?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268284
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вытаскивать dto то не будет.... для ридонли там еще нужно посмотреть .... не так все просто.


В том плане что недостаточно указать просто транзакцию как ридонли .... нужно обязательно указать флаг ридонли в true.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268285
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Если вытаскивать dto то не будет.... для ридонли там еще нужно посмотреть .... не так все просто.


В том плане что недостаточно указать просто транзакцию как ридонли .... нужно обязательно указать флаг ридонли в true.
А
Либо через StatelessSession тянуть.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268287
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я конечно туплю, но "dirty checking" - что Вы под этими словами подразумеваете?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268291
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Или добавить @Immutable над классом)
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268299
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

То что сам производитель и создатель хибернейта... плюс это куча абстракций...куча оберток... куча проксей и конечно же кеш... что очень улучшает вашу жизнь и делает оцбой ваш запрос на порядок а то и два медленнее)
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268301
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот наверное самое простое описание для другого фреймворка ,но и для хибера подходит


Dirty checking
По этому принципу работает AngularJS. Dirty checking — это проверка на изменененность данных, простая как два рубля. Раньше переменная myVar была 1, теперь она 2 — значит данные изменились и надо их в шаблоне перерисовать. Для простых переменных это оператор !=, для сложных — соответствующие легковесные процедуры. Это простейший подход, который избавляет нас как от необходимости работать с данными через специальный «слушающий» слой, так и от всех проблем, связанных с зависимостями данных.




Что в свою очередь ведёт нас к вопросу равенства двух объектов на уровне jvm и на уровне базы данных ..... я уже спрашивал по этому поводу автора как он пишет хешкод и иквалс и тостринг.... но ответа не было....
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268305
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
Мда смешались в кучу люди кони, имххо у вас какая то каша в голове. Дирти чек это когда передаешь ентити весь граф на мердж, и оно там ищет какие объекты поменялись чтобы сгенить апдейт инсерт делает. Иквалс хэшкод по айдишнику.ту стринг нафиг не нужен. Выборка через джипикуэл. Да кстати я просил два вложенных списка)) видимо задачки для собеседования пошли во вред)) без обид
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268309
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут как вариант пример

http://rsdn.ru/forum/java/4586631.all


Тут описание тест и решение

https://vladmihalcea.com/2014/08/29/how-to-customize-hibernate-dirty-checking-mechanism/
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268331
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Тут как вариант пример

http://rsdn.ru/forum/java/4586631.all


Тут описание тест и решение

https://vladmihalcea.com/2014/08/29/how-to-customize-hibernate-dirty-checking-mechanism/
Это как раз следствие open session in view.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268353
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне одному нижеприведенный код кажется немного странным? Раскручивать стек, что бы получить ф-цию откуда мы вызвались.... да еще дергать данный код в каждом сеттере.....

Код: java
1.
        String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268355
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,

Я жду вашего решения с коллекциями ...
)

И да вот пример для чека есть персона два поля имя и возраст.... инстанс Иванов 33.

Вытащили поменяли возраст на 34


вопрос какой запрос на апдейт сгенерит хибер?)

А если 20 полей в перосоне?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268356
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ха... работал с Хибером в Oracle CC&B, там похоже был реализован "Bytecode instrumentation" dirty checking. А я честно говоря думал, что это стандартная фича Hibernate
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268361
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268364
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Во во....я уже тут тему поднимал...но не зашла.... все вокруг думают (или просто мне так кажется) что хибер это очень просто и не нужно знать sql и вообще ничего понимать не нужно ...

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 @Test
    @Commit
    public void showSpecificExecutionOrder() {
        // 1. select client
        Client client = getSession().get(Client.class, 10);
        // 2. select account
        Account account = client.getAccounts().get(0);
        // 3. delete account
        getSession().delete(account);
        // 4. update client
        client.setName("Elvis");
        // 5. insert new report
        Report report = new Report();
        report.setDescription("Client has been updated; Account has been removed");
        getSession().persist(report);
    }




Какие запросы и в какой последовательности будет генерить хибер?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268366
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
Вы удивитесь но сгенерит именно то что вы будете писать руками, тоесть один апдейт. Я писал как у меня сделано. Зато Кроме копипастов из интернетов от вас ничего не было.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268489
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Atum1,
Вы удивитесь но сгенерит именно то что вы будете писать руками, тоесть один апдейт. Я писал как у меня сделано. Зато Кроме копипастов из интернетов от вас ничего не было.

Вчера писал с телефона ...вот полный тест с данными :


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<dataset>
    <Client id_client="10" name="John" age="23"/>
    <Client id_client="11" name="Mike" age="28"/>
    <Client id_client="12" name="Kevin" age="19"/>

    <Account id_account="10" amount="50" currency="USD" id_client="10"/>
    <Account id_account="11" amount="100" currency="USD" id_client="10"/>
    <Account id_account="12" amount="150" currency="EUR" id_client="11"/>
    <Account id_account="13" amount="200" currency="EUR" id_client="12"/>
</dataset>




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Entity
@Getter
@Setter
public class Client implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id_client")
    private Integer id;

    private String name;
    private int age;

    @OneToMany(mappedBy = "client"/*, orphanRemoval = true*/)
    private List<Account> accounts = new ArrayList<>();


    }



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Entity
@Getter
@Setter
public class Account implements Serializable {
    @Id
    @GeneratedValue
    @Column(name = "id_account")
    private Integer id;

    private int amount;
    private String currency;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_client")
    private Client client;

    }




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Entity
@Getter
@Setter
@ToString
public class Report implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Integer id;

    private String description;
}





Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    @Test
    @Commit
    public void showSpecificExecutionOrder() {
        // 1. select client
        Client client = getSession().get(Client.class, 10);
        // 2. select account
        Account account = client.getAccounts().get(0);
        // 3. delete account
        getSession().delete(account);
        // 4. update client
        client.setName("Elvis");
        // 5. insert new report
        Report report = new Report();
        report.setDescription("Client has been updated; Account has been removed");
        getSession().persist(report);
    }




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Hibernate:  
    insert 
    into
        CLIENT
        (ID_CLIENT, NAME, AGE) 
    values
        (10, 'John', 23) 
Hibernate:  
    insert 
    into
        CLIENT
        (ID_CLIENT, NAME, AGE) 
    values
        (11, 'Mike', 28)
Hibernate:  
    insert 
    into
        CLIENT
        (ID_CLIENT, NAME, AGE) 
    values
        (12, 'Kevin', 19) 
Hibernate:  
    insert 
    into
        ACCOUNT
        (ID_ACCOUNT, AMOUNT, CURRENCY, ID_CLIENT) 
    values
        (10, 50, 'USD', 10) 
Hibernate:  
    insert 
    into
        ACCOUNT
        (ID_ACCOUNT, AMOUNT, CURRENCY, ID_CLIENT) 
    values
        (11, 100, 'USD', 10) 
Hibernate:  
    insert 
    into
        ACCOUNT
        (ID_ACCOUNT, AMOUNT, CURRENCY, ID_CLIENT) 
    values
        (12, 150, 'EUR', 11) {elapsed: 0ms}
Hibernate:  
    insert 
    into
        ACCOUNT
        (ID_ACCOUNT, AMOUNT, CURRENCY, ID_CLIENT) 
    values
        (13, 200, 'EUR', 12) 



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
select
        client0_.id_client as id_clien1_1_0_,
        client0_.age as age2_1_0_,
        client0_.name as name3_1_0_ 
    from
        Client client0_ 
    where
        client0_.id_client=10 {elapsed: 135ms}
Hibernate:  
    select
        accounts0_.id_client as id_clien4_0_0_,
        accounts0_.id_account as id_accou1_0_0_,
        accounts0_.id_account as id_accou1_0_1_,
        accounts0_.amount as amount2_0_1_,
        accounts0_.id_client as id_clien4_0_1_,
        accounts0_.currency as currency3_0_1_ 
    from
        Account accounts0_ 
    where
        accounts0_.id_client=10 {elapsed: 2ms}
Hibernate:  
    call next value for hibernate_sequence {elapsed: 3ms}
TRANSACTION BEFORECOMMIT!!!
Hibernate:  
    /* insert com.jeeconf.hibernate.basics.entity.Report
        */ insert 
        into
            Report
            (description, id) 
        values
            ('Client has been updated; Account has been removed', 1) {elapsed: 1ms}
Hibernate:  
    /* update
        com.jeeconf.hibernate.basics.entity.Client */ update
            Client 
        set
            age=23,
            name='Elvis' 
        where
            id_client=10 {elapsed: 1ms}
Hibernate:  
    /* delete com.jeeconf.hibernate.basics.entity.Account */ delete 
        from
            Account 
        where
            id_account=10 {elapsed: 1ms}

TRANSACTION COMPLETE!!!



Не видите ничего странного ?

например что нарушается порядок выполнения кода ?

1)что сначала у вас выполнился insert Report

2)потом update ( причем почему то указаны сразу два поля !!!! age=23, name='Elvis' )

3) и в конце delete Account
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268549
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
По поводу порядка запросов - а какая вам разница-то? Если в этой же транзакции используется помимо хибернейта еще clean jdbc/mybatis например, то перед их вызовом сделать flush/refresh. Про апдейт двух полей - ну не знаю честно говоря почему, но не критично (хотя интересно). А теперь представьте сколько времени вы руками будете это все писать.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268560
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Atum1,
По поводу порядка запросов - а какая вам разница-то? Если в этой же транзакции используется помимо хибернейта еще clean jdbc/mybatis например, то перед их вызовом сделать flush/refresh. Про апдейт двух полей - ну не знаю честно говоря почему, но не критично (хотя интересно). А теперь представьте сколько времени вы руками будете это все писать.

Ну как какая разница - она есть .... вы пишете один код - а он делает совсем другое ....

1)Про update - ставите @DynamicUpdate(true) - будет обновлять только одно поле ... но... но ..нужно понимать в каких случаях себе в ногу попадете :) Это решение , почему так - потому что Хибер думает что еще кто то где то мог ваш обхект или его поля изменять и перестраховывается и апдейтит все сразу , даже то что вы не меняли .

Код: java
1.
2.
3.
4.
5.
@Entity
@Getter
@Setter
@DynamicUpdate(true) 
public class Client implements Serializable {




про хибер еще тут
2)
YouTube Video
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268572
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНу как какая разница - она есть .... вы пишете один код - а он делает совсем другое ....
Потому что он через кэш сессии работает, а не напрямую с базой. Синхронизация с базой по коммиту, нужно раньше - flush/refresh. Единственно, что на данный момент напрягает это все-таки джойны OneToOne nullable и отсутствие on условия в join fetch...Зато не надо колбасить маппинги на резалтсет, даже в хваленом mybatis, два списка вложенных - полтора экрана маппингов. С ума сойдешь.
...
Рейтинг: 0 / 0
25 сообщений из 79, страница 2 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA много @OneToOne
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]