2017-02-20 1 views
2

Я разрабатываю многопользовательское веб-приложение с использованием подхода «Общие базы данных/отдельные схемы» с использованием java, jpa (eclipselink), mysql. Мой файл живучесть выглядит следующим образом:Как добавить отсутствующие столбцы в многопользовательском веб-приложении на основе нескольких схем, используя eclipselink

<persistence-unit name="GroupBuilderPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
      <exclude-unlisted-classes>false</exclude-unlisted-classes> 
      <properties> 
       <property name="eclipselink.cache.shared.default" value="false"/> 
       <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/?"/> 
       <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/> 
<--- Here goes other properties definition --> 
     </persistence-unit> 

Теперь вот мой EntityMangerFactory и EntityManager:

emfForTenant = Persistence.createEntityManagerFactory("GroupBuilderPU"); 
EntityManager em = emfForTenant.createEntityManager(); 
     em.setProperty("eclipselink.tenant-id", schemaNameAsTenantId); 

Сво работает отлично до тех пор пока я добавляю любой новый столбец настойчивость в любой организации.

Как меня есть Entity UserAccount где я добавил новый столбец «Строка rentalinfo»:

@Entity 
@Multitenant(MultitenantType.TABLE_PER_TENANT) 
@TenantTableDiscriminator(type = TenantTableDiscriminatorType.SCHEMA, contextProperty = PersistenceUnitProperties.MULTITENANT_PROPERTY_DEFAULT) 
public class UserAccount implements Serializable { 
... 
private String rentalinfo;//Newly added column 
... 
} 

Теперь после того, что следующая строка дает ошибку:

em.createQuery("SELECT ua FROM UserAccount ua").getResultList(); 

ошибка:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'RENTALINFO' in 'field list' 

Итак, каким будет решение для добавления нового столбца (расширение таблицы) в этом приложении плотва?

ответ

1

Вы получаете это исключение, потому что столбец 'RENTALINFO' не существует на вашей таблице UserAccount. В нормальных условиях установка "create-or-extend-tables" будет иметь EclipseLink, чтобы добавить к вашей существующей таблице ALTER, добавив новый столбец. Однако, казалось бы, поколение DDL не поддерживается для MultitenantType.TABLE_PER_TENANT: https://wiki.eclipse.org/EclipseLink/DesignDocs/Multi-Tenancy/TablePerTenant

Not supported:

  1. Schema generation will not be supported since it requires knowledge of all the tenants (schema's) and further to that, access provision must be set once the tables are created if using schema level table per tenant.

Так нет ALTER и ваша таблица не имеет столбца.

В качестве примечания, вы можете включить EclipseLink протоколирования SQL, используя следующие свойства сохраняемости:

<properties> 
    <property name="eclipselink.logging.level" value="ALL"/> 
    <property name="eclipselink.logging.level.sql" value="FINE"/> 
    <property name="eclipselink.logging.parameters" value="true"/> 
</properties> 

Таким образом, вы можете видеть, какие запросы EclipseLink есть (или в данном случае, не является) выполнение ,

+0

Yeap, я знаю, что генерация ddl не поддерживается для MultitenantType.Table_PER_TENANT. Кстати, решение состоит в том, чтобы использовать любой инструмент миграции db, такой как flyway, Liquibase и т. Д. Я использую пролет для решения :) –

+0

@FarhanNazmul ah Я предположил, что вы искали решение, в котором EclipseLink расширяет ваши таблицы. тогда да, решение было бы просто расширить таблицу самостоятельно или с помощью инструмента ... рад, что вы все это разработали. –

Смежные вопросы