LINUX.ORG.RU

jOOQ + JPA в одном проекте - возможно ли?

 , , , ,


0

1

Есть проект с JPA. Сейчас его нужно хорошенько допилить. Желания дальше работать через JPA нет. Хочется jOOQ. Можно ли до момента полного замещения JPA на jOOQ использовать их совместно к одной БД (с транзакциями) в одном проекте?

Проект SpringBoot.

База для JPA и jOOQ будет одна и та же. На jOOQ уже используются новые таблицы (было реализовано в тестовом отдельном проекте, где нет JPA)

★★★★★

Последнее исправление: bvn13 (всего исправлений: 1)

(с транзакциями)

Поясни, ты хочешь начать жпа транзакцию, выполнить в ней жоокю, потом закатить жпа транзакцию?

На счёт транзакций скорее всего - да, а вот с кешами можешь словить проблем, если получаешь данные разными способами.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)

Ну под капотом и там и там обычный jdbc. Проблем никаких не будет. С кешами JPA естественно будут, отключай или инвалидируй и тд.

Legioner ★★★★★
()
Ответ на: комментарий от ya-betmen

нет. я хочу наращивать новый функционал, не затрагивая старый. Для старого функционала - пусть работает как раньше, Hibernate, Entity, JPA, свои транзакции. В новом - все через jOOQ. Код пересекаться не будет. Мне сейчас понять, как SpringBoot настроить, чтобы оно работало.

Сейчас настрока для jOOQ выглядит так:

package ru.pivdom.exchange.config;

import com.zaxxer.hikari.HikariDataSource;
import org.jooq.DSLContext;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.jooq.impl.DataSourceConnectionProvider;
import org.postgresql.ds.PGSimpleDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.sql.DataSource;

/**
 * Created by bvn13 on 20.07.2017.
 */

@Configuration
@EnableTransactionManagement
public class DatasourceConfig {

    @Autowired
    private Environment env;

    @Value("${postgresql.host}")
    private String dbHost;

    @Value("${postgresql.port}")
    private String dbPort;

    @Value("${postgresql.database}")
    private String dbName;

    @Value("${postgresql.user}")
    private String dbUser;

    @Value("${postgresql.pass}")
    private String dbPass;

    //@Bean(name = "HikariPool", destroyMethod = "close")
    public HikariDataSource dataSource() {

        final String url = new StringBuilder()
                .append("jdbc:postgresql://")
                .append(dbHost)
                .append(":")
                .append(dbPort)
                .append("/")
                .append(dbName)
                .toString();

        HikariDataSource dataSource = new HikariDataSource();

        PGSimpleDataSource pgDataSource = new PGSimpleDataSource();
        pgDataSource.setServerName(dbHost);
        pgDataSource.setPortNumber(Integer.parseInt(dbPort));
        pgDataSource.setDatabaseName(dbName);
        pgDataSource.setUser(dbUser);
        pgDataSource.setPassword(dbPass);

        dataSource.setDataSource(pgDataSource);

        return dataSource;
    }


    // JOOQ
    @Bean
    public TransactionAwareDataSourceProxy transactionAwareDataSource() {
        return new TransactionAwareDataSourceProxy(dataSource());
    }

    @Bean
    public DataSourceConnectionProvider connectionProvider() {
        return new DataSourceConnectionProvider(transactionAwareDataSource());
    }

    @Bean
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean()
    public DSLContext jooq() {
        // Generated source assumes the development DB.  Dynamically change it to the production DB name.
        // The DB name used in the generated DSL (see the Maven plugin use) will not be the same as
        // the production DB, unless running in a local dev env!  withSchemata allows us
        // to override that during runtime.

        //Settings settings = new Settings().withRenderMapping(new RenderMapping().withSchemata(new MappedSchema().withInput("[SANDBOX DB NAME]").withOutput(dbName)));
        //return DSL.using(connectionProvider(), SQLDialect.POSTGRES, settings);

        return DSL.using(connectionProvider(), SQLDialect.POSTGRES);
    }

}

При этом проект запускается, но при обращении к любому старому коду (который через JPA) - выдаются ошибки вида:

2017-08-24 15:08:55.914  WARN 23928 --- [nio-8099-exec-9] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 42703
2017-08-24 15:08:55.914 ERROR 23928 --- [nio-8099-exec-9] o.h.engine.jdbc.spi.SqlExceptionHelper   : ОШИБКА: столбец user0_.userid не существует
  Позиция: 8
2017-08-24 15:08:55.916 ERROR 23928 --- [nio-8099-exec-9] w.a.UsernamePasswordAuthenticationFilter : An internal error occurred while trying to authenticate the user.

...
Caused by: org.postgresql.util.PSQLException: ОШИБКА: столбец user0_.userid не существует

пысы. слишком большое сообщение

ППС. Ошибка тут https://pastebin.com/utnN1uPe

bvn13 ★★★★★
() автор топика
Последнее исправление: bvn13 (всего исправлений: 1)
Ответ на: комментарий от Legioner

что за кеши? Как отключать?

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

ну пример-то есть, который на jpa сильно жизнь портит, а с jooq проект давно сдан и все бухают на пляжах?

и как жить после всех этих oneToMany, которые тебе расплодили таблиц связи? аццкие джоины через 3 их самых?

Rastafarra ★★★★
()
Последнее исправление: Rastafarra (всего исправлений: 1)
Ответ на: комментарий от bvn13

не вопрос.

у меня тоже jpa и время от времени я подумываю, а что если...

но обилие табличек отбивает желание...

Rastafarra ★★★★
()

Связать через аннотации jpa и non-jpa операции у тебя не выйдет, и в приведенном тобой конфиге внезапно не будут работать jpa транзакции.
Вообще есть красивый spring-data-jpa в котором можно использовать native-sql. И вообще не используй коллекции в jpa-entity, это зло и никому не нужно.

anonymous
()
Ответ на: комментарий от Rastafarra

Проблема +1-request, довольно часто не нужны данные из коллекции и используем lazy, а потом вдруг нужны эти данные и получаем их в цикле и прочее прочее прочее. Гораздо проще использовать manyToOne и доставать нужные данные отдельным запросом.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.