我有两个具有多对一(一对多)关系的实体。
类ParserEntity:
import javax.persistence.*;
@Entity
@Table(name = "parser", schema = "newsmonitoringdb")
public class ParserEntity {
public ParserEntity() {
}
public ParserEntity(String name, SourceTypesEntity type) {
this.name = name;
this.type = type;
}
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Basic
@Column(name = "name")
private String name;
@ManyToOne(optional = false)
@JoinColumn(name="type",referencedColumnName="id")
private SourceTypesEntity type;
...//getters, setters and other fields are here
}
}
类ParserTypesEntity:
import javax.persistence.*;
import java.util.Collection;
import java.util.List;
/**
* Created by User on 17.08.2016.
*/
@Entity
@Table(name = "source_types", schema = "newsmonitoringdb")
public class ParserTypesEntity {
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Basic
@Column(name = "name")
private String name;
@OneToMany(mappedBy="type", fetch=FetchType.EAGER, targetEntity = ParserEntity.class)
private Collection<ParserEntity> siteParser;
...//getters and setters are here
}
}
他们按领域有关系,一切似乎都很好。
但是,我希望ParserTypeEntity类仅将来自ParserEntity类的名称保存在单独的Collection字段中,而不是保存ParserEntity列表。
我希望从数据库中检索类型时能像现在使用ParserEntity对象一样自动填充它们。
有没有办法做到这一点,或者我必须更改与单向对象的关系,获取所有类型,然后通过其ID获取每种类型的名称?
最佳答案
他们按领域有关系,一切似乎都很好。但是我会
类似于ParserTypeEntity类,仅保存ParserEntity中的名称
类放在一个单独的Collection字段中,而不是ParserEntity列表中。
我希望在检索类型时自动填充它们
从DB中获取数据的方式与现在使用ParserEntity对象的方式相同。
我认为您不能使用转换器与集合建立关系。
此外,即使可以,我也不会使用它,因为它会使代码的自然性和可读性降低。对于一个枚举,它是有用的且具有整体外观,但对于实体集合,由于它破坏了实体之间的ORM关系,因此看起来像是黑客。
如果使用JPA/EntityManager
,我可以提出一种解决方法:使用实体的生命周期事件。否则,如果使用Hibernate / SessionFactory,则应查找Hibernate的侦听器。这是相同的原则。
想法是保留您的实际映射,并添加一个包含您希望的数据的暂态列表,这些数据将在加载ParserTypesEntity
时以自动方式填充。
因此,在ParserTypesEntity
中,您可以添加一个hook方法来在加载实体时进行处理。在这种方法中,您可以收集parserEntity
集合的名称并将其添加到transient List<String>
中。
public class ParserTypesEntity {
...
@Transient
private List<String> parserTypeNames;
@PostLoad
public void postLoad() {
parserTypeNames = new ArrayList<>();
for (ParserEntity parserEntity : siteParser){
parserTypeNames.add(parserEntity.getName());
}
...
}