Кажется, что несколько файлов persistence.xml являются общей проблемой с JPA, решенным только приемами classloading.
обходное решение А, которое работает на меня, должно определить несколько единиц персистентности в одном файле persistence.xml и затем удостовериться, что Ваше развертывание и тестовый код используют различную привязку (в Spring, можно установить "persistenceUnitName" свойство на фабрике менеджера по объекту). Это загрязняет Ваш файл развертывания тестовой конфигурацией, но если Вы не возражаете против этого, это работает хорошо.
Type.IsSubclassOf () Определяет, является ли класс, представленный текущим типом, производным от класса, представленного указанным типом.
Я понимаю, что это не дает прямого ответа на ваш вопрос, но вы можете подумать об использовании этого вместо метода в вашем примере:
public static bool IsDescendantOf<T>(this object o)
{
if(o == null) throw new ArgumentNullException();
return typeof(T).IsSubclassOf(o.GetType());
}
Таким образом, вы можете использовать его следующим образом:
C c = new C();
c.IsDescendantOf<A>();
Также , чтобы ответить на ваш вопрос о разнице между Type.IsSubclassOf и Type.IsAssignableFrom - IsAssignableFrom слабее в том смысле, что если у вас есть два объекта a и b, такие, что это верно:
a = b;
Затем typeof (A). IsAssignableFrom (b.GetType ())
истинно - поэтому a может быть подклассом b или типом интерфейса.
Напротив, a.GetType (). IsSubclassOf (typeof (B))
вернет истину, только если a является подклассом b. Учитывая имя вашего метода расширения, я бы сказал, что вам следует использовать IsSubclassOf вместо IsAssignable to;
Я думаю, вы ищете этот Type.IsSubclassOf ()
Изменить:
Я не знаю ваших требований, но, возможно, это лучший способ:
bool isDescendant = cValue is C;