Несколько баз данных с Spring + Hibernate + JPA

Хотя ответы, похоже, работают для людей, если вы используете Spring Security, я нашел расширение LoginUrlAuthenticationEntryPoint и добавление определенного кода для более эффективного управления AJAX. Большинство примеров перехватывают все перенаправляют не только неудачи аутентификации. Это было нежелательно для проекта, над которым я работаю. Возможно, вам также потребуется расширить ExceptionTranslationFilter и переопределить метод sendStartAuthentication, чтобы удалить шаг кэширования, если вы не хотите, чтобы сбойный запрос AJAX был кеширован.

Пример AjaxAwareAuthenticationEntryPoint:

public class AjaxAwareAuthenticationEntryPoint extends
    LoginUrlAuthenticationEntryPoint {

    public AjaxAwareAuthenticationEntryPoint(String loginUrl) {
        super(loginUrl);
    }

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
        if (isAjax(request)) {
            response.sendError(HttpStatus.UNAUTHORIZED.value(), "Please re-authenticate yourself");
        } else {
        super.commence(request, response, authException);
        }
    }

    public static boolean isAjax(HttpServletRequest request) {
        return request != null && "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
    }
}

Источники: 1 , 2

30
задан Floern 16 November 2017 в 13:46
поделиться

3 ответа

Вам необходимо использовать свойство persistenceXmlLocations (обратите внимание на множественное число), а не persistenceXmlLocation . Это строковый массив, поэтому он будет автоматически преобразован из списка:

<bean id="persistenceUnitManager"
      class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
  <property name="persistenceXmlLocations"><list>
    <value>classpath*:config/persistence.local.xml</value>
    <value>classpath*:config/persistence.remote.xml</value>
  </list></property>
  ...

Обновление (на основе редактирования)

В вашем entityManagerFactory не указано свойство persistenceUnitName . Вы должны сделать это явно, потому что вы определяете более одной единицы сохранения состояния, а entityManagerFactory должен знать, какой из них использовать.

15
ответ дан 28 November 2019 в 00:21
поделиться

Если вы последуете этому руководству, http://www.javacodegeeks.com/2010/05/jboss-42x-spring-3-jpa-hibernate.html вы можете внести следующие изменения для доступа к двум различным базам данных:

  1. постоянство. xml определите вторую единицу преследования для вашей второй базы данных.
  2. spring.xml, определите второй bean-компонент entityManagerFactory под другим именем, скажем, «entityManagerFactoryDB2» и сконфигурируйте его для использования постоянного модуля для второй базы данных.
  3. для каждого DAO, к которому вы хотите получить доступ, вторая база данных включает следующее:

     @Autowired
    частный EntityManagerFactory entityManagerFactoryDB2;
    
    @PostConstruct
    public void init () {
    super.setEntityManagerFactory (entityManagerFactoryDB2);
    }
    

Вот и все!

В весенних классах обслуживания используйте DAO как обычно!

6
ответ дан 28 November 2019 в 00:21
поделиться

Джастин, номер 3 можно сделать более стандартным способом, например:

  1. В контексте Spring:

     
    
  2. В ваших управляемых Spring DAO (обратите внимание на свойство unitName):

     @PersistenceContext (unitName = "pu1" `) protected EntityManager entityManager;
    

Таким образом, должным образом настроенный EntityManager, соответствующий единице сохранения состояния с именем «pu1», будет внедрен в соответствующие DAO.

8
ответ дан 28 November 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: