Java JPA класс для MATLAB - PullRequest
       23

Java JPA класс для MATLAB

7 голосов
/ 07 декабря 2010

Я использую MATLAB R2007b, Java 1.6 SE, Eclipse Helios и MySql 5 в Windows XP Pro SP3.

Я пытаюсь создать библиотеку классов, которая использует аннотации JPA для доступа к MySql 5база данных.Идея состоит в том, что сценарий MATLAB создает экземпляры этих объектов Java, которые предоставляют API для доступа к БД.

Я могу создавать свои аннотированные классы, которые работают в Eclipse (т. Е. Тест JUnit).Я могу экспортировать код в jar, который я могу запустить из командной строки.

Я обновляю путь к классам Java MATLAB с помощью javaaddpath ().Я могу создать свой класс в MATLAB.Но когда я вызываю свою функцию init (), которая вызывает javax.persistence.Persistence.createEntityManagerFactory (), я получаю страшный

«Нет поставщика сохраняемости для EntityManager»

Эта ошибка обычно означает, чтоФайл persistence.xml не в нужном месте.Но это должно быть потому, что мой кувшин работает из командной строки.Добавление папки META-INF в путь Java-класса MATLAB не помогает.Также не происходит извлечение jar и добавление извлеченной структуры папок в путь к классам, независимо от того, добавлен ли META-INF или нет.

У кого-нибудь есть идеи, сумасшедшие или нет?Кто-нибудь когда-либо делал это в любой версии MATLAB.

Спасибо.

-reilly.

Ответы [ 5 ]

8 голосов
/ 07 декабря 2010

При работе с Java в MATLAB я часто сталкивался с проблемами с динамическим classpath . Как обходной путь, использование classpath.txt решило любую проблему до сих пор.

Работа с различными средами, например, тестированием и производством, приводит к появлению нескольких файлов classpath.txt в вашем начальном каталоге MATLAB. Использование разных версий MATLAB добавляет еще один множитель к числу classpath.txt файлов вокруг.

ClassPathHacker.java - это опция для добавления динамически классов и файлов JAR к вашему статическому пути к классам. При таком подходе больше нет необходимости прикасаться к classpath.txt. Ваша конфигурация Java classpath может оставаться в заданном месте startup.m.

8 голосов
/ 07 декабря 2010

Ну, я нашел «ответ».Где-то, прежде чем я увидел пост о разнице в "динамических" и "статических" cp в MATLAB.«Статический» cp - это текстовый файл, который загружается при запуске.«Динамический» cp загружается во время выполнения, и вы обычно манипулируете им с помощью вызовов m-script.Это то, что я пытался сделать.

Итак, я добавил свои баночки в динамический путь, и он не работал.

Я добавил их в конец статического пути и получил РАЗНЫЕ ошибки, который, казалось, имел отношение к разбору XML.Прогресс!

Затем я добавил свои баночки в НАЧАЛО статического пути, и он работает.

Цитирую Барта Симпсона: Глупый.

Спасибо за все ваши идеи.Задайте мне вопрос на C #, чтобы я мог ответить взаимностью ...

-reilly.

3 голосов
/ 07 декабря 2010

Это всего лишь продолжение вашего ответа о статических и динамических путях классов. Вот функция, которая позволит вам определить, где класс Java загружается из Matlab, и если есть какие-либо маскировки определений классов, возможно, именно поэтому он был чувствителен к упорядочению для вас. Вы можете увидеть другие столкновения; по крайней мере, dom4j.jar и commons-collection.jar поставляются с Matlab, но я не знаю, какие версии.

function whereisjavaclassloadingfrom(ClassName)
%WHEREISJAVACLASSLOADINGFROM  Show where a Java class is loaded from
%
% whereisjavaclassloadingfrom(ClassName)
%
% Shows where a Java class is loaded from in this Matlab session's JVM.
% This is for diagnosing Java class load problems, such as classpath
% ordering issues, seeing if a class of a given name is included in an
% unexpected JAR file, etc.
%
% Displays output to console.
%
% Examples:
%
% whereisjavaclassloadingfrom('java.util.HashMap')
% whereisjavaclassloadingfrom('com.ldhenergy.etools.MxUtil')
% whereisjavaclassloadingfrom('com.google.common.collect.Maps')
% whereisjavaclassloadingfrom('org.apache.commons.math.complex.Complex')

% Use javaArray to get Class object without having to instantiate. This
% lets it work with objects that have private or non-zero-arg constructors,
% and avoids side effects of object construction.
% (Would use java.lang.Class.forName(), because that's a more direct way of
% doing this, but it doesn't work for stuff on the dynamic classpath.)
ja = javaArray(ClassName,1);
klass = ja.getClass().getComponentType();

klassLoader = klass.getClassLoader();
if isempty(klassLoader)
    % JVM used null to represent the "bootstrap" class loader
    % I think that's the same as the "system" class loader
    klassLoader = java.lang.ClassLoader.getSystemClassLoader();
end
klassLoaderStr = char(klassLoader.toString());

klassFilePath = [strrep(ClassName, '.', '/') '.class'];
try
    % This logic assumes that the classes exist as files in the class
    % loader. It's a valid assumption for mainstream class loaders,
    % including the one's I've seen with Matlab.
    klassUrl = klassLoader.getResource(klassFilePath);
    if isempty(klassUrl)
        klassUrlStr = '';
    else
        klassUrlStr = char(klassUrl.toString());
    end
catch err
    klassUrlStr = sprintf('ERROR: %s', err.message);
end

% Get all locations, to reveal masked definitions
urls = enumeration2array(klassLoader.getResources(klassFilePath));

disp(sprintf('Version: %s\nClass:       %s\nClassLoader: %s\nURL:         %s', version,...
    char(klass.getName()), klassLoaderStr, klassUrlStr));
if numel(urls) > 1
    disp('Class is masked:');
    for i = 1:numel(urls)
        disp(sprintf('URL %d:       %s', i, char(urls(i))));
    end
end

%%
function out = enumeration2array(jenum)
tmp = {};
while jenum.hasMoreElements()
    tmp{end+1} = jenum.nextElement();
end
out = [tmp{:}];
2 голосов
/ 07 декабря 2010

Убедитесь, что на вашем пути к классам есть jar-провайдер JPA (например, eclipselink.jar).

0 голосов
/ 07 декабря 2010

Вы абсолютно уверены, что правильно написали название единицы персистентности при вызове:

javax.persistence.Persistence.createEntityManagerFactory(String puName)

Это также даст вам ту же ошибку. Имя чувствительно к регистру.

...