Java JdbcSQLSyntaxErrorException:SQL语句中的语法错误;DROP TABLE PUBLIC.PRODUCTS-[*]用户(如果存在)”;
我正在尝试编写测试并使用内存数据库。我的问题是从hibernate实体创建测试模式 我有这样的实体Java JdbcSQLSyntaxErrorException:SQL语句中的语法错误;DROP TABLE PUBLIC.PRODUCTS-[*]用户(如果存在)”;,java,postgresql,hibernate,jdbc,h2,Java,Postgresql,Hibernate,Jdbc,H2,我正在尝试编写测试并使用内存数据库。我的问题是从hibernate实体创建测试模式 我有这样的实体 @Entity @Table(name = "users", schema = "public") @Getter @Setter @NoArgsConstructor public class User { @Id @Column(name = "user_id", updatable = false, nullable = false, unique = true)
@Entity
@Table(name = "users", schema = "public")
@Getter
@Setter
@NoArgsConstructor
public class User {
@Id
@Column(name = "user_id", updatable = false, nullable = false, unique = true)
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;
@Column(name = "name")
private String name;
@Column(name = "product")
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
@JoinTable(name = "products_users",
joinColumns = {@JoinColumn(name = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "product_id")})
private Set<Product> products;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss")
@Column(name = "created_on")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Date createdOn;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss")
@Column(name = "modified_on")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Date modifiedOn;
public User(String name, Set<Product> products, Date createdOn, Date modifiedOn) {
this.name = name;
this.products = products;
this.createdOn = createdOn;
this.modifiedOn = modifiedOn;
}
}
@Entity
@Table(name = "product", schema = "public")
@Getter
@Setter
@NoArgsConstructor
public class Product {
@Id
@Column(name = "product_id", updatable = false, nullable = false, unique = true)
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;
@Column(name = "name")
private String name;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd@HH:mm:ss")
@Column(name = "created_on")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Date createdOn;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd@HH:mm:ss")
@Column(name = "modified_on")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Date modifiedOn;
public Product(String name, Date createdOn, Date modifiedOn) {
this.name = name;
this.createdOn = createdOn;
this.modifiedOn = modifiedOn;
}
}
@Entity
@Table(name = "products_users", schema = "public")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ProductsUsers {
@Id
@Column(name = "user_id", updatable = false, nullable = false, unique = true)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private UUID userId;
@Column(name = "product_id")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private UUID productId;
}
我有
应用程序属性
在测试包中
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS public;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.default_schema=public
我有这样的例外
org.hibernate.tool.schema.spi.CommandAcceptanceException:错误
正在执行DDL“alter table”public.“products\U users”drop约束
通过JDBC语句“FK2W1YLWIYJUY67N1CR5LV5OR3”
原因:org.h2.jdbc.JdbcSQLSyntaxErrorException:表
未找到“产品和用户”;SQL语句:ALTERTABLE
“公共”。“产品\用户”删除约束
“FK2W1YLWIYJUY67N1Cr5Lv5Or3”
嗯,“产品用户”需要被转义。SQL生成在这方面可能有一个错误,但是如果您急于继续开发,请切换到更经典和用户友好的“products\u users”name.FWIW,您的应用程序的“tests”版本中似乎没有指定Hibernate方言。properties。@Kayaman,谢谢,但我还有一个例外,h2似乎没有看到实体org.hibernate.tool.schema.spi.CommandAcceptanceException:通过JDBC语句执行DDL“alter table products_users drop constraint FKs13160e0qfdn6jmmrte6q619q”时出错,原因是:org.h2.JDBC.JdbcSQLSyntaxErrorException:未找到表“products_users”;SQL语句:alter table products_users drop约束FKs13160e0qfdn6jmmrte6q619q[42102-199]@GordThompson,它没有帮助请回复:@Kayaman-Hibernate的注释还有一个“全局引用标识符”(true/false)属性,可能有助于对象名转义。
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS public;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.default_schema=public