Java EclipseLink JPA Postgres JsonObject到JSONB转换器
我对EclipseLink和Postgres的“扩展”使用还比较陌生,所以我希望有人能帮助我 我有以下型号:Java EclipseLink JPA Postgres JsonObject到JSONB转换器,java,postgresql,jpa,eclipselink,jsonb,Java,Postgresql,Jpa,Eclipselink,Jsonb,我对EclipseLink和Postgres的“扩展”使用还比较陌生,所以我希望有人能帮助我 我有以下型号: package co.nayo.backend.models; import co.nayo.backend.models.helpers.JSONConverter; import co.nayo.backend.models.helpers.UUIDConverter; import org.eclipse.persistence.annotations.Convert; impo
package co.nayo.backend.models;
import co.nayo.backend.models.helpers.JSONConverter;
import co.nayo.backend.models.helpers.UUIDConverter;
import org.eclipse.persistence.annotations.Convert;
import org.eclipse.persistence.annotations.Converter;
import javax.json.JsonObject;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
import java.util.UUID;
@Entity
@Table(name = "subscriptions")
@Converter(name = "uuid_converter", converterClass = UUIDConverter.class)
@Converter(name = "json_converter", converterClass = JSONConverter.class)
public class Subscription {
@Id
@Column(name = "subscription_id", updatable = false)
@Convert("uuid_converter")
private UUID subscriptionId;
@Column(name = "title")
private String title;
@Column(name = "description")
private String description;
@Column(name = "billing_cycle")
private String billingCycle;
@Column(name = "amount")
private double amount;
@Column(name = "currency")
private String currency;
@Column(name = "invoice_title")
private String invoiceTitle;
@Column(name = "invoice_description")
private String invoiceDescription;
@Column(name = "public")
private boolean isPublic;
@Column(name = "permissions")
@Convert("json_converter")
private JsonObject permissions;
@Column(name = "active")
private boolean active;
@Column(name = "created_at")
private Date createdAt;
// Getters & Setters
}
在其中,我需要/想要一个javax.json.JsonObject
,用于映射到JSONB
postgres数据类型的permissions
字段。
因此,我编写了这个转换器来处理转换
package co.nayo.backend.models.helpers;
import org.eclipse.persistence.internal.helper.DatabaseField;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.DirectCollectionMapping;
import org.eclipse.persistence.mappings.converters.Converter;
import org.eclipse.persistence.sessions.Session;
import javax.json.JsonObject;
import java.sql.Types;
public class JSONConverter implements Converter {
@Override
public JsonObject convertObjectValueToDataValue(Object objectValue, Session session) {
return (JsonObject)objectValue;
}
@Override
public JsonObject convertDataValueToObjectValue(Object dataValue, Session session) {
return (JsonObject)dataValue;
}
@Override
public boolean isMutable() {
return true;
}
@Override
public void initialize(DatabaseMapping databaseMapping, Session session) {
final DatabaseField field;
if(databaseMapping instanceof DirectCollectionMapping) {
field = ((DirectCollectionMapping)databaseMapping).getDirectField();
} else {
field = databaseMapping.getField();
}
field.setSqlType(Types.OTHER);
field.setTypeName("JsonObject");
field.setType(JsonObject.class);
field.setColumnDefinition("jsonb");
}
}
当我尝试保留新订阅时,出现以下错误:
内部异常:org.postgresql.util.psql异常:错误:列
“权限”的类型为jsonb,但表达式的类型为hstore提示:您需要重写或强制转换表达式。职位:224 错误代码:0 所以出于某种原因(我还不明白),EclipseLink似乎忽略了JSONB绑定 当我更改
字段.setColumnDefinition(“jsonb”)时代码>到字段。setColumnDefinition(“hstore”)
一切正常,但postgres数据类型现在当然是hstore
有人能给我指出正确的方向吗?我怎样才能让它使用JSONB
数据类型
提前感谢并致以亲切的问候,
Bob对于我来说,我必须扩展JPABASE配置以使转换器工作:
@Configuration
public class JpaConfiguration extends JpaBaseConfiguration {
protected JpaConfiguration(DataSource dataSource, JpaProperties properties,
ObjectProvider<JtaTransactionManager> jtaTransactionManagerProvider,
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
super(dataSource, properties, jtaTransactionManagerProvider, transactionManagerCustomizers);
}
@Override
protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
return new EclipseLinkJpaVendorAdapter();
}
@Override
protected Map<String, Object> getVendorProperties() {
final HashMap<String, Object> map = new HashMap<>();
map.put(PersistenceUnitProperties.WEAVING, detectWeavingMode());
map.put(PersistenceUnitProperties.VALIDATION_MODE, ValidationMode.NONE.toString());
return map;
}
private String detectWeavingMode() {
return InstrumentationLoadTimeWeaver.isInstrumentationAvailable() ? "true" : "static";
}
}
@配置
公共类JPA配置扩展了JpaBaseConfiguration{
受保护的JPA配置(数据源数据源、JPA属性、,
对象提供程序jtaTransactionManagerProvider,
ObjectProvider TransactionManagerUsers){
超级(数据源、属性、jtaTransactionManagerProvider、TransactionManagerConstomizers);
}
@凌驾
受保护的AbstractJpaVendorAdapter createJpaVendorAdapter(){
返回新的EclipseLinkJpaVendorAdapter();
}
@凌驾
受保护的映射getVendorProperties(){
final HashMap map=新HashMap();
put(PersistenceUnitProperties.WEAVING,detectWeavingMode());
put(PersistenceUnitProperties.VALIDATION_MODE,ValidationMode.NONE.toString());
返回图;
}
私有字符串检测AvingMode(){
return InstrumentationLoadTimeWeaver.isInstrumentationAvailable()?“true”:“static”;
}
}
看看这个