Java hibernate实体的参数化构造函数

Java hibernate实体的参数化构造函数,java,json,hibernate,Java,Json,Hibernate,TL;DR 有没有办法在加载后将一些参数干净地传递给hibernate实例化的对象 我拥有的 @Entity public class MyEntity { @Lob private String mapAsJson; @Transient private Map<Long, Double> map = new HashMap<>(); // Getters, null-checks, and all that. Always

TL;DR

有没有办法在加载后将一些参数干净地传递给hibernate实例化的对象

我拥有的

@Entity
public class MyEntity {
    @Lob
    private String mapAsJson;

    @Transient
    private Map<Long, Double> map = new HashMap<>();

    // Getters, null-checks, and all that. Always keeping these two in sync, or at least before it persists
}
可能的解决方案#2

@Embeddable
public class MyEmbedded<K, V> {
    @NotNull
    private Class<K> keyClass;
    @NotNull
    private Class<V> valClass;

    // [...]

    // Call this in the entity once, on the embedded. Maybe on @PostLoad?
    public MyEmbedded<K, V> init(Class<K> keyClass, Class<V> valClass) {
        this.keyClass = keyClass;
        this.valClass = valClass;
    }
}
@可嵌入
公共类MyEmbedded{
@NotNull
私有类密钥类;
@NotNull
私人阶级;
// [...]
//在实体中调用此函数一次,在嵌入式上调用。可能在@PostLoad上调用?
public MyEmbedded init(类keyClass,类valClass){
this.keyClass=keyClass;
this.valClass=valClass;
}
}

由于您进一步指定了
JsonUtil
是一个自己的类,我建议为
JsonUtil.fromString
使用以下签名:

publicstaticmap fromString(stringjson,Class-keyClass,

Class valueClass,@SuppressWarnings(“rawtypes”)Class由于您进一步指定
JsonUtil
是一个自己的类,我建议为
JsonUtil.fromString
使用以下签名:

publicstaticmap fromString(stringjson,Class-keyClass,

Class valueClass,@SuppressWarnings(“rawtypes”)Class确切的类是什么
JsonUtil
?-您使用的是哪个库。如果使用了正确的映射(map),您的变体“What I want”应该可以工作不过,您必须验证所有条目实际上都是
Double
s.@TreffnonX
JsonUtil
只需委托给
com.fasterxml.jackson.databind.ObjectMapper
,只需在顶部进行一些检查和异常处理。验证目前不会成为问题,正如我在编译时所知道的,我想在nd滚开。这有意义吗?那么你正在使用自己的
JsonUtil
类将
mapAsJson
解析为实际的映射?那么该方法需要是通用的。我将在下面发布一个完整的答案。确切的类是什么
JsonUtil
?-你在使用哪个库。如果使用了正确的映射(Map),你的变体“What I want”应该可以工作不过,您必须验证所有条目实际上都是
Double
s.@TreffnonX
JsonUtil
只需委托给
com.fasterxml.jackson.databind.ObjectMapper
,只需在顶部进行一些检查和异常处理。验证目前不会成为问题,正如我在编译时所知道的,我想在nd滚开。这有意义吗?那么你正在使用自己的
JsonUtil
类将
mapAsJson
解析为一个实际的映射?那么该方法需要是通用的。我将在下面发布一个完整的答案。我感谢你的回答,但我的问题更像是一个休眠的问题。我需要一种优雅的方式告诉我的
嵌入的
对象键和值类。只有这样,我才能应用您的建议。我感谢您的回答,但我的问题更像是一个hibernate问题。我需要一种优雅的方式来告诉我的
嵌入式
对象什么是键和值类。只有这样,我才能应用您的建议。
@Entity
public class MyEntity {
    @Embedded
    private MyEmbedded<Long, Double> embeddedMap = new MyEmbedded<>(Long.class, Double.class);
}

@Embeddable
public class MyEmbedded<K, V> {
    @NotNull
    private Class<K> keyClass;
    @NotNull
    private Class<V> valClass;

    protected MyEmbedded() {

    }

    public MyEmbedded(Class<K> keyClass, Class<V> valClass) {
        this.keyClass = keyClass;
        this.valClass = valClass;
    }

    // [...]

    @PostLoad
    private void loadFromJson() {
        map.clear();
        if (mapAsJson != null)
            // NOTICE THIS DIFFERENT LINE
            map.putAll(JsonUtil.fromString(mapAsJson, HashMap.class, keyClass, valClass));
    }
}
@Embeddable
public class MyEmbedded<K, V> {
    @NotNull
    private Class<K> keyClass;
    @NotNull
    private Class<V> valClass;

    // [...]

    // Call this in the entity once, on the embedded. Maybe on @PostLoad?
    public MyEmbedded<K, V> init(Class<K> keyClass, Class<V> valClass) {
        this.keyClass = keyClass;
        this.valClass = valClass;
    }
}