Java自定义实体关系

Java自定义实体关系,java,hibernate,jpa,relational-database,entity-attribute-value,Java,Hibernate,Jpa,Relational Database,Entity Attribute Value,我有一个带有一些默认字段的实体。但我也需要有能力用动态场来扩展它。字段与表(而不是特定实体)相关。我需要能够添加他们从管理面板(这是某种EAV) 所以我有这样的实体 public class Account { @Id private Long id; @Column(name = "account_name") private String accountName; @Column(name = "first_name") private String firstName; @Colu

我有一个带有一些默认字段的实体。但我也需要有能力用动态场来扩展它。字段与表(而不是特定实体)相关。我需要能够添加他们从管理面板(这是某种EAV)

所以我有这样的实体

public class Account {

@Id
private Long id;

@Column(name = "account_name")
private String accountName;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;
//getters setters
}
例如,我想用新的列“敬礼”来扩展它。 我创建了两个表:第一个用于自定义字段名,第二个用于适当的值:

CREATE TABLE custom_fields
(
id BIGINT(20) unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT,  
entity VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL
);

CREATE TABLE custom_field_values
(
id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
custom_field_id BIGINT(20) unsigned NOT NULL,
entity_id BIGINT(20) unsigned NOT NULL,
value VARCHAR(255) NOT NULL
);
CREATE UNIQUE INDEX UQ_custom_value ON custom_field_values(custom_field_id, entity_id);
现在我需要一些帐户实体的关系,以获得customFieldName=>customFieldValue的映射。是否可以仅通过where子句创建关系,如

SELECT name FROM custom_fields WHERE entity = "account"
用于映射键和值

SELECT value FROM custom_field_values INNER JOIN custom_fields ON custom_fields.id = custom_field_values.custom_field_id WHERE entity_id = :id
可能吗?我需要提供从管理面板创建此列的能力,以及为用户填充以前创建的自定义字段的能力


谢谢

您想在运行时向实体中添加一列,然后向实体中添加数据?是的,但它必须将其存储在数据库中。实际上,我以前没有遇到过类似的情况,但即使您允许这样做,如果服务器因任何原因停机,您也可以这样做,您将失去对新列的控制,因此在下次重新启动服务器时,您在运行时创建的列将无法对其进行任何控制,因此您不应该执行类似操作,否则您将最终成为更大的控制者。我为什么要失去它们?列以及相应的值存储在DB中。但db结构被称为“垂直”db(数据是来自两个表的组合),在出于任何原因重新启动服务器后,您能否告诉我,您如何从JPA实体中知道物理上不作为属性存在于JPA java实体中,但仅存在于数据库中的新列?