2014-10-16 2 views
0

У меня работает приложение JPA, и теперь я хочу поддерживать многопользовательскую работу. Мне нравится использовать XML вместо аннотаций.Поддержка JPA eclipselnk multi-tenancy

У меня есть пара orm.xml, на которую ссылается persistence.xml.

<entity-mappings 
    xmlns="http://java.sun.com/xml/ns/persistence/orm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd" 
    version="2.0"> 

    <package>mypackage</package> 

    <entity class="Foo" /> 
    <entity class="Bar" /> 

</entity-mappings> 

Я хотел бы использовать ту же конфигурацию несколько найма для всех субъектов: однотабличных, колонка дискриминатора tenantUserId, контекстно-свойство tenant.userId.

По: https://wiki.eclipse.org/EclipseLink/Examples/JPA/EclipseLink-ORM.XML

<tenant-discriminator-column name="tenantUserId" context-property="tenant.userId"/> 

ли поставить линию выше? Я попытался создать EclipseLink-orm.xml следующего

<?xml version="1.0" encoding="UTF-8" ?> 
<entity-mappings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/orm http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_2_1.xsd" 
    version="2.1"> 

    <tenant-discriminator-column name="tenantUserId" context-property="tenant.userId"/> 

    <persistence-unit-metadata> 
     <persistence-unit-defaults> 
      <tenant-discriminator-column name="tenantUserId" context-property="tenant.userId"/> 
     </persistence-unit-defaults> 
    </persistence-unit-metadata> 
</entity-mappings> 

Оба являются недействительными в соответствии со схемой. Где положить eclipselink-orm.xml?

Есть ли способ сказать, что: все объекты являются многопользовательскими (одна таблица)? Должен ли я указывать их для всех объектов один за другим?

<entity-mappings 
    xmlns="http://java.sun.com/xml/ns/persistence/orm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd" 
    version="2.0"> 

    <package>mypackage</package> 

    <entity class="Foo" > 
     <multi-tenant/> 
    </entity> 

    <entity class="Bar" > 
     <multi-tenant/> 
    </entity> 

</entity-mappings> 

Спасибо.

ответ

1

С http://www.eclipse.org/eclipselink/documentation/2.5/solutions/multitenancy002.htm вы используете единицы сохранения по умолчанию правильно, как:

<persistence-unit-metadata> 
    <persistence-unit-defaults> 
     <tenant-discriminator-column name="tenantUserId" context-property="tenant.userId"/> 
    </persistence-unit-defaults> 
</persistence-unit-metadata> 

Проблема вы используете неправильную версию схемы. 2.1 не включали функции с несколькими функциями, поэтому вам нужно использовать 2,5 xds, eclipselink_orm_2_5.xsd. Это должно быть в eclipselink.jar или вытащено из git, как описывает здесь Джеймс http://git.eclipse.org/c/eclipselink/eclipselink.runtime.git/tree/jpa/org.eclipse.persistence.jpa/resource/org/eclipse/persistence/jpa

+0

Спасибо. изменена версия до 2.5. – eastwater

+0

Я использовал сопоставленный суперкласс для определения многоуровневости для иерархии классов. Есть ли способ отключить multitenant для одного класса в иерархии? Благодарю. – eastwater