我有两个具有多对一(一对多)关系的实体。

类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());
   }
  ...
}

07-24 19:04