我一直在尝试使用JPA / Hibernate来CRUD操作EAV数据模型并且一直面临很多性能损失。我正在寻找有效管理EAV数据模型的想法。
**(A)**So here is an example of what I am trying to deal with, I have three tables :
UserTable
AttributesTable
UserAttributeValueTable
**(B)**And apart from these three, I have other relations like :
ItemTable
UserItemsRelationTable
基本上,AttributesTable是一个包含所有属性的表,可能是User或Item。 UserAttributeValueTable是连接UserId,AttributeId和值的表。
现在,假设我想要提取所有用户及其属性。
以下是我如何映射它们:
@Entity
UserTable{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="USER_ID")
private long userId;
@OneToMany(targetEntity=UserAttributeValueTable.class, mappedBy="userTable", fetch=FetchType.LAZY)
private List<UserAttributeValueTable> userAttributeValues;
//Other Columns
}
@Entity
UserAttributeValueTable{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="USER_ATTRIBUTE_VALUE_ID")
private long userAttributeValueId;
@Column(name="\"VALUE\"")
private String value;
//bi-directional many-to-one association to AttributesTable
@ManyToOne(targetEntity=AttributesTable .class ,fetch=FetchType.LAZY)
@JoinColumn(name="ATTRIBUTE_ID")
private AttributesTable attributes;
//bi-directional many-to-one association to UserTable
@ManyToOne(targetEntity=UserTable.class,fetch=FetchType.LAZY)
@JoinColumn(name="USER_ID")
@JsonIgnore
private UserTable user;
//Other columns
}
@Entity
AttributeTable{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ATTRIBUTE_ID")
private long attrId;
@Column(name="ATTRIBUTE_NAME")
private String attrName;
//Other columns
}
问题: 1.当我执行findAll时,我遇到了一个无限循环,这很明显,所以我使用了@JsonIgnore,因此它会忽略UsersTable。但是,要检索300个用户(用户属性值),需要花费大量时间,而且我也不会查找每个列。我只想以这种方式压扁它:
User :[{ id:"1", name:"John", otherAttributes={attr1:"value1",attr2:"value2"},{ id:"2", name:"Joey", otherAttributes={attr1:"value1",attr2:"value2"}]
在编写简单的SQL查询后,我觉得在这些动态模型中更容易,其中列不是字段而是属性。有什么建议吗?
我正在使用Spring Data JPA。