Как настроить транзакции как для веб-приложений, так и для пакетных заданий с использованием Spring и Hibernate

У меня есть приложение, использующее Spring 2.5 и Hibernate 3.

Вот ' sa со слоем представления, слоем обслуживания и слоем DAO, а также некоторыми заданиями Quartz, совместно использующими один и тот же уровень сервиса и DAO.

Транзакции инициализируются на разных уровнях с помощью аннотаций @Transactional, например:

alt text

Это привело меня к описанной здесь проблеме: Управление настройками внутренней транзакции из внешней транзакции с помощью Spring 2.5

Я прочитал немного о том, как настроить транзакции для соединения Spring и Hibernate. Похоже, что рекомендуемый подход - инициализировать транзакции на уровне сервиса.

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

И когда мне действительно нужна транзакция для задания, вызывающего несколько методов службы, кажется, что у меня нет возможность продолжить инициализацию транзакций из заданий. В документации по Android указано ... Если вы открываете байтовые данные, которые слишком велики для размещения в таблице ...

У меня есть несколько больших файлов (изображений и видео), которые мне нужно хранить у поставщика контента. В документации Android указано ...

Если вы открываете байтовые данные, слишком большой, чтобы положить в саму таблицу - например, большой растровый файл - поле, которое предоставляет данные клиентам должен фактически содержать content: URI строка. Это поле, которое дает клиенты получают доступ к файлу данных. В запись также должна иметь другое поле, с именем "_data", в котором перечислены точные путь к файлу на устройстве для этого файла. Это поле не предназначено для чтения клиентом, но ContentResolver. Клиент позвонит ContentResolver.openInputStream () в обращенное к пользователю поле, содержащее URI за товар. ContentResolver будет запросите для этого поле "_data" рекорд, и потому что у него выше разрешений, чем клиент, он должен иметь доступ к этому файлу напрямую и вернуть оболочку чтения для файла клиенту. - http://developer.android.com/guide/topics/providers/content-providers.html#creating

Мне трудно найти пример. В частности, я хочу использовать растровое изображение в контексте ImageView. Рассмотрим следующий квазикод кода (он не работает) ...

ImageView iv = ....
String iconUri = cursor.getString(cursor.getColumnIndex(Table.ICON));
iv.setImageURI(Uri.parse(iconUri));

Наблюдения / Проблемы ...

  1. Как можно правильно восстановить сохраненный / восстановленный uri? (это текст в таблице)
  2. Реализация setImageURI использует разрешение содержимого openInputStream, так что это должно работать.

     Схема строки = mUri.getScheme ();
    ...
    } else if (ContentResolver.SCHEME_CONTENT.equals (scheme)
    || ContentResolver.SCHEME_FILE.equals (scheme)) {
     пытаться {
     d = Drawable.createFromStream (
     mContext.getContentResolver (). openInputStream (mUri),
     ноль);
    

    - frameworks / base / core / java / android / widget / ImageView.java

У меня все заработало. Я взял подсказку из MediaStore и MediaProvider. Файлы, содержащие данные, именуются на основе поставщика содержимого (каталога), имени столбца, идентификатора строки и типа носителя. Затем преобразователь контента получает дескриптор файла следующим образом ...

Uri iconUri = Uri.withAppendedPath(Table.getUri(cursor), Table.ICON);
ib.setImageURI(iconUri);

... и поставщик контента отвечает тем же ...

@Override
public ParcelFileDescriptor openFile (Uri uri, String mode) {
int imode = 0;
if (mode.contains("w")) imode |= ParcelFileDescriptor.MODE_WRITE_ONLY;
if (mode.contains("r")) imode |= ParcelFileDescriptor.MODE_READ_ONLY;
if (mode.contains("+")) imode |= ParcelFileDescriptor.MODE_APPEND;
List pseg = uri.getPathSegments();
if (pseg.size() < 3) return null;

try {
    File filePath = filePathFromRecord(pseg.get(2), pseg.get(1));
    return ParcelFileDescriptor.open(filePath, imode);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
return null;
}

13
задан sth 13 November 2010 в 04:32
поделиться