使用hibMap视图,但避免在springboot中生成表

dddzy1tm  于 2023-03-18  发布在  Spring
关注(0)|答案(2)|浏览(107)

我想Map视图并使用JPA进行查询。
假设我的观点如下:

@Entity
@Immutable
@Table(name = "active_task_view")
@Getter @Setter
@NoArgsConstructor
public class ActiveTaskViewEntity {

    private long id;
    private String taskName;
    private String workflowName;
    private String userName;
    private LocalDate createdAt;
    private LocalDate updatedAt;

}

我设置了applications.properties允许生成实体:

spring.jpa.hibernate.ddl-auto= create
spring.jpa.defer-datasource-initialization=true
spring.sql.init.data-locations=classpath:import.sql
spring.jpa.generate-ddl = true
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=TRACE
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

我的问题如下:视图被创建为表。我把实体放在一个特定的包里,而表放在另一个包里。我不知道如何定义应该生成哪些表,哪些实体应该只用作Map。
实际上,视图应该存在于类路径的import.sql文件中(尚未实现)。

plicqrtu

plicqrtu1#

有几个“选项”(我自己更喜欢使用liquibase):
I.用@Subselect而不是@Table标记实体,如下所示:

@Subselect("select * from active_task_view")

II.实现org.hibernate.tool.schema.spi.SchemaFilterProvider,我认为应该看起来像:
HBN部件:

import org.hibernate.mapping.Table;
import org.hibernate.tool.schema.internal.DefaultSchemaFilter;
import org.hibernate.tool.schema.internal.DefaultSchemaFilterProvider;
import org.hibernate.tool.schema.spi.SchemaFilter;

public class SchemaFilterProviderCustom extends DefaultSchemaFilterProvider {

    @Override
    public SchemaFilter getCreateFilter() {
        return new DefaultSchemaFilter() {
            @Override
            public boolean includeTable(Table table) {
                // logic here
                return true/false;
            }
        };
    }
}

Boot 部件:

@Component
public class SchemaFilterProviderCustomizer implements HibernatePropertiesCustomizer {

    @Override
    public void customize(Map<String, Object> hibernateProperties) {
        hibernateProperties.put(
                AvailableSettings.HBM2DDL_FILTER_PROVIDER,
                new SchemaFilterProviderCustom()
        );
    }
    
}
a1o7rhls

a1o7rhls2#

实际上,我只是简单地设置了实体扫描的基本包...

@SpringBootApplication
@EntityScan(basePackages = { "fr.mycompany.app.entity.table" })
public class WsApplication {
    public static void main(String[] args) {
        SpringApplication.run(WsApplication.class, args);
    }
}

我的视图被Map到一个不同的包中,比如fr.mycompany.app.entity.view它没有在我的数据库中生成我的视图,这似乎是最简单的方法,视图在init的sql文件中处理。

相关问题