2017-02-20 10 views
2

java, jpa (eclipselink), mysql을 사용하여 "Shared Database/Separate Schemas"접근 방식으로 멀티 테넌트 웹 애플리케이션을 개발 중입니다.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); 

그것 내가 어떤 실체에 새로운 지속성 열을 추가 해요 잘 전까지 작업.

나는 새 열 '문자열 rentalinfo'추가 한 법인 UserAccount 것 같은 : 이제

@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' 열이 없기 때문에이 예외가 발생합니다. 정상적인 상황에서 "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 로깅을 설정 할 수 있습니다 : 당신은 EclipseLink가 무엇인지 쿼리 볼 수

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

이 방법을 실행 (또는이 경우되지 않습니다) .

+0

Yeap, MultitenantType.Table_PER_TENANT에는 ddl 세대가 지원되지 않습니다. Btw 솔루션은 flyway, liquibase 등등과 같은 데이터베이스 이동 도구를 사용하는 것입니다. flyway를 사용하고 있습니다. :) –

+0

@FarhanNazmul 아, EclipseLink가 테이블을 확장하는 것과 관련된 솔루션을 찾고 있다고 가정 했었습니다. 그렇다면 솔루션은 테이블을 직접 확장하거나 도구를 사용하는 것입니다. 다행스럽게도 해결할 수 있습니다. –