gpt4 book ai didi

hibernate - Spring Boot JPA不会在查询表中添加模式名称

转载 作者:行者123 更新时间:2023-12-04 17:43:36 25 4
gpt4 key购买 nike

据我了解(例如,从here),如果我为实体指定架构,则在创建查询时它应使用该架构名称。

因此,如果我有以下实体:

@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是数据源,我只会看到一个问题。

我已经阅读了有关在默认架构中为要引用的表创建 View 的信息。但是,这不是一个可行的选择,因为我将不得不创建很多 View 。看来,Hibernate应该可以轻松解决这一问题。

这是application.properties的配置设置:
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

更改URL中模式的名称可以使我访问该模式中的数据,但是除了URL中列出的模式之外,我无法访问任何其他模式。

最佳答案

我刚刚将应用程序从使用手工制作的EntityManager配置迁移到Spring Boot 2.0,然后立即出现了这些问题。

做事的正确方法是使用

@Table(name="proposalstatuses",catalog = "sales")

...如上述@ suneet-khurana所建议。请注意,MySQL不支持架构,您需要改为使用 catalog

但是,在我们的情况下,这需要更改许多实体,并且在短期内,我想避免代码更改,并使用配置还原为将模式名称嵌入表名称的旧行为。

因此,经过一番研究和调试,我发现显式设置以下属性可以解决问题:
spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

看起来Spring Boot JPA中的默认实现是 SpringPhysicalNamingStrategy,它通过用下划线替换所有点来消除名称的困惑。

关于hibernate - Spring Boot JPA不会在查询表中添加模式名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47296766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com