Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JdbcSQLSyntaxErrorException:SQL语句中的语法错误;DROP TABLE PUBLIC.PRODUCTS-[*]用户(如果存在)”;_Java_Postgresql_Hibernate_Jdbc_H2 - Fatal编程技术网

Java JdbcSQLSyntaxErrorException:SQL语句中的语法错误;DROP TABLE PUBLIC.PRODUCTS-[*]用户(如果存在)”;

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)

我正在尝试编写测试并使用内存数据库。我的问题是从hibernate实体创建测试模式

我有这样的实体

@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