使hibernate实体与postgres和sqlite for json字段一起工作
需要在远程设备(由sqlite支持)和云(由postgres支持)上运行相同版本的应用程序。帐户实体看起来像:使hibernate实体与postgres和sqlite for json字段一起工作,hibernate,sqlite,hibernate-mapping,hibernate-types,hibernate-postgresql,Hibernate,Sqlite,Hibernate Mapping,Hibernate Types,Hibernate Postgresql,需要在远程设备(由sqlite支持)和云(由postgres支持)上运行相同版本的应用程序。帐户实体看起来像: @Entity @Table(name="account") public class Account extends BaseEntity{ @Id @Column(name="id") private String id; @C
@Entity
@Table(name="account")
public class Account extends BaseEntity{
@Id
@Column(name="id")
private String id;
@Column(name="valid_from")
private LocalDateTime validFrom;
@Column(name="expires_on")
private LocalDateTime expiresOn;
@Column(name="events")
@Convert(converter = EventListConverter.class)
@NotNull
@NotEmpty
private List<Event> events;
<代码>@实体
@表(name=“account”)
公共类帐户扩展BaseEntity{
@身份证
@列(name=“id”)
私有字符串id;
@列(name=“valid\u from”)
private LocalDateTime validFrom;
@列(name=“到期日”)
私有LocalDateTime expiresOn;
@列(name=“events”)
@Convert(converter=EventListConverter.class)
@NotNull
@空空如也
私人列表活动;
EventListConverter
正在将events
转换为JSON字符串并返回到SQLite的List
。然而,Postgres上的events
列的类型为jsonb
,我们如何使其同时适用于这两种类型
限制条件:
POSTGRES模式无法更改(SQLite中的事件可以更改为二进制)我想问题在于生成的DDL,因为您使用了hbm2ddl更新
我建议您通过Liquibase或Flyway等工具进行模式更新,因为这些工具可以为每个DBMS定义DDL。如果您真的必须使用hbm2ddl,您可以对
方言
实现进行子类化,并提供自定义表格导出器
。您需要复制一点标准表格导出器
,但这是可行的,您可以将列类型重新映射到您认为更合适的任何类型。感谢您的响应。我们正在使用Flyway
为远程计算机托管时运行sqlite
的DDL,同时我们必须适应云的现有postgres模式。您能提供一些关于扩展方言的更多参考吗代码>关于重新映射列类型的部分?由于您使用Flyway,为PostgreSQL编写自定义DDL有什么问题?您只需复制org.hibernate.tool.schema.internal.StandardTableExporter#getSqlCreateStrings
,并在呈现SQL类型时进行自定义映射,例如从“JSONB”到“text”对于sqlite,我对hibernate和flyway是相当新的,这里不在同一页:)两个问题,1.启动时flyway模式迁移-我们只想用它来管理sqlite-postgres是现有的,也被另一个应用程序使用(因此没有更改)2.一旦flyway迁移完成,服务启动(Micronat api)-flyway如何帮助使用目标数据库执行ORM,不是在hibernate实体级别吗?我可以通过将事件
字段设置为字符串类型,并使用另一个临时字段来获取字符串的反序列化版本来解决此问题