2017-11-14 1 views
1

내 엔터티 용 스키마를 지정하면 이해할 수있는 것 (예 : here)에서 쿼리를 만들 때 해당 스키마 이름을 사용해야합니다. 내가의 실체가있는 경우스프링 부트 JPA가 쿼리의 테이블에 스키마 이름을 추가하지 않습니다.

그래서 :

@Entity 
@Table(name="proposalstatuses",schema="sales") 
public class ProposalStatus implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private int proposalStatusID; 
    private String proposalStatusName; 

    public ProposalStatus() {} 

    public ProposalStatus(String proposalStatusName) { 
     this.proposalStatusName = proposalStatusName; 
    } 

    @Id 
    @Column(name="pk_proposalstatusid") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public int getProposalStatusID() { 
     return proposalStatusID; 
    } 

    public void setProposalStatusID(int proposalStatusID) { 
     this.proposalStatusID = proposalStatusID; 
    } 

    @Column(name="proposalstatusname", unique=true, nullable=false) 
    public String getProposalStatusName() { 
     return proposalStatusName; 
    } 

    public void setProposalStatusName(String proposalStatusName) { 
     this.proposalStatusName = proposalStatusName; 
    } 
} 

을 그때 Hibernate가 select ... from sales.proposalstatuses처럼 그 쿼리를 생성 할 것으로 예상한다.

select proposalst0_.pk_proposalstatusid as pk_propo1_8_, proposalst0_.proposalstatusname as proposal2_8_ 
from proposalstatuses proposalst0_ 
order by proposalst0_.proposalstatusname asc 

이이 경우에 큰 문제가되지 않지만 지금은 다른 스키마의 테이블 조인을 사용할 수 있도록하려면, 그것은 테이블을 생각하기 때문에 그 실패 : 그러나, 대신 나는 참조 존재하지 않습니다 (기본 스키마에 포함되어 있지 않습니다).

그래서 하나의 데이터베이스 (하나의 연결)에 여러 스키마가 있습니다. Hibernate가 테이블을 참조 할 때 스키마 이름을 사용하게하려면 어떻게해야합니까? 그것은 매우 똑바로 앞으로해야하지만, 나는 뭔가를 놓치고 있어야합니다 것 같습니다.
감사합니다.

나는 Hibernate JPA 2.1과 Hibernate Core 5.0.12를 사용하는 Spring Boot 1.5.7을 사용하고있다. H2 데이터 소스를 사용하면이 작업이 가능합니다. MySQL이 데이터 소스 일 경우에만 문제가 발생합니다.

참조하려는 테이블의 기본 스키마에서보기를 만드는 방법에 대해 읽었습니다. 그러나 그것은 내가보기에 매우 많은 의견을 만들어야하기 때문에 가능한 선택 사항은 아닙니다. Hibernate가 그렇게 많은 노력을하지 않아도 이것을 처리 할 수 ​​있어야합니다. URL에 스키마의 이름을 변경

spring.datasource.url=jdbc:mysql://localhost/sales?verifyServerCertificate=false&useSSL=true 
spring.datasource.username=user 
spring.datasource.password=pass 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
spring.datasource.testWhileIdle=true 
spring.datasource.validationQuery=SELECT 1 
spring.jpa.show-sql=true 
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy 

날 스키마의 데이터에 액세스 할 수 있습니다,하지만 난 다른 스키마를 얻을 수 : 여기

는 application.properties에서 구성 설정입니다 URL에 나열된 것보다

답변

1

처리 방법은 이름 충돌이있는 항목에 스키마을 지정하는 것입니다.

사용

@Table(name="TABLE_NAME", schema="SCHEMA_NAME") 

또는

@Table(name="SCHEMA_NAME.TABLE_NAME") 
+0

그것이 이미 문제가되는 방법이 아닙니까? – eis

+0

네, 첫 번째 옵션은 이미 가지고있는 방법입니다. 나는 두 번째 옵션을 먼저 시도했지만 그 중 하나는 작동하지 않는 것 같습니다. – Tim

+0

"testschema"라는 스키마에서 "test"라는 테이블에 대해 두 번째 옵션을 사용하면 sales.testschema_test가 존재하지 않는다는 오류가 발생합니다. 따라서 테이블 어노테이션에 지정된 것과 관계없이 구성 URL의 스키마를 계속 사용하려고합니다. – Tim

1

내가 구성뿐만 아니라 데이터베이스 유형에되었다 키입니다. MySQL에서는 데이터베이스와 스키마가 실제로 구분되지 않습니다. @Table 주석의 schema 속성은 "실제"스키마를 참조하지만 MySQL에서 정의 된 스키마는 아닙니다. 이것은 스키마 속성이 H2 데이터베이스에서는 작동하지만 MySQL에서는 작동하지 않는 이유를 설명합니다.

데이터 소스 URL에 기본 스키마가 있기 때문에 @Table (name = "SCHEMA_NAME.TABLE_NAME") 주석이 처음에는 작동하지 않았습니다. url이 필요했습니다

spring.datasource.url=jdbc:mysql://localhost?verifyServerCertificate=false&useSSL=true 

이 변경 사항은 모두 MySQL에서 작동합니다.

H2와 함께 작동하려면 이 아닌hibernate.default_schema 속성을 정의해야합니다.

관련 문제