gpt4 book ai didi

Hibernate/JPA 将列映射到 Map 类型

转载 作者:行者123 更新时间:2023-12-03 09:01:57 25 4
gpt4 key购买 nike

此处为 Spring Boot、Hibernate/JPA 和 MySQL。我有下表:

CREATE TABLE IF NOT EXISTS fizzbuzzes (
fizzbuzz_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
fizzbuzz_type_a VARCHAR(250) NOT NULL,
fizzbuzz_type_b VARCHAR(250) NOT NULL,
fizzbuzz_type_c VARCHAR(250) NOT NULL,
fizzbuzz_type_d VARCHAR(250) NOT NULL,
fizzbuzz_type_e VARCHAR(250) NOT NULL,
fizzbuzz_type_f VARCHAR(250) NOT NULL,
fizzbuzz_type_g VARCHAR(250) NOT NULL,
fizzbuzz_type_h VARCHAR(250) NOT NULL,
fizzbuzz_type_i VARCHAR(250) NOT NULL,
fizzbuzz_type_j VARCHAR(250) NOT NULL,
fizzbuzz_type_k VARCHAR(250) NOT NULL,
fizzbuzz_type_l VARCHAR(250) NOT NULL,
fizzbuzz_type_m VARCHAR(250) NOT NULL,
fizzbuzz_type_n VARCHAR(250) NOT NULL,
fizzbuzz_type_o VARCHAR(250) NOT NULL,
fizzbuzz_type_p VARCHAR(250) NOT NULL,

CONSTRAINT pk_fizzbuzzes PRIMARY KEY (fizzbuzz_id);
);

我希望将此表 O/R 映射到具有 Map<String,String> 的 JPA 实体。 持有所有类型 A 到 P 的嘶嘶声。

因此,而不是您通常会看到的内容:

@Entity
@Table(name = "fizzbuzzes")
public class Fizzbuzz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "fizzbuzz_type_a")
private String typeA;

@Column(name = "fizzbuzz_type_a")
private String typeB;

// ...

@Column(name = "fizzbuzz_type_a")
private String typeP;

// Getters, setters & ctors
}

...相反,我想要:

@Entity
@Table(name = "fizzbuzzes")
public class Fizzbuzz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "???")
private Map<String,String> types;

// Getters, setters & ctors
}

types的键在哪里可能是硬编码字符串typeA , typeB , ..., typePtypes 的值将是数据库表中相应列的值。

这可以做到吗?如果可以的话怎么做?

最佳答案

有点。如果您同意将类型值放在单独的表中,则这是可能的。然后您可以使用@ElmentCollection@MapKeyColumn

例如:

@ElementCollection
@MapKeyColumn(name="type_key")
@Column(name="type_value")
@CollectionTable(name="fizzbuzz_types", joinColumns=@JoinColumn(name="fizzbuzz_id"))
Map<String, String> types= new HashMap<>();

否则,您需要像第一个示例中那样对类型列进行硬编码,并且可以添加 @PostLoad@PrePersist Hook 将静态列转换为/来自 transient map 。

类似于:

@Entity
@Table(name = "fizzbuzzes")
public class Fizzbuzz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "fizzbuzz_type_a")
private String typeA;

@Column(name = "fizzbuzz_type_a")
private String typeB;

@Transient
private Map<String, String> types = new HashMap<>();

@PostLoad
public void toMap() {
this.types.put("typeA", this.typeA);
this.types.put("typeB", this.typeB);
}
@PrePersist
public void fromMap() {
this.typeA = this.types.get("typeA");
this.typeB= this.types.get("typeB");
}
}

关于Hibernate/JPA 将列映射到 Map 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49478768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com