JPA实体之间的关系。如何使实体从DB中仅从关系表的某些字段中获取

时间:2016-08-20 19:24:11

标签: java mysql jpa foreign-keys mapping

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

Class 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
    }
}

Class 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类中保存名称,而不是ParserEntity列表。

我希望在从DB中检索类型时自动填充它们,就像现在使用ParserEntity对象一样。

有没有办法做到这一点,或者我必须改变与单向的关系,获取所有类型,然后通过其id获取每种类型的名称?

1 个答案:

答案 0 :(得分:0)

  

他们有一个领域的关系,一切似乎都好。不过我愿意   像ParserTypeEntity类一样只保存ParserEntity中的名称   class在单独的Collection字段中而不是ParserEntity列表。

     

我希望在检索类型时自动填充它们   来自DB,就像现在用ParserEntity对象一样。

我认为您不能将转换器用于与集合的关系 此外,即使你可以,我也不会使用它,因为它可以使代码更不自然,更不易读。对于一个枚举,它是有用的和整体的装饰,但对于实体集合,它看起来像一个黑客,因为它打破了实体之间的ORM关系。

如果您使用JPA/EntityManager,我可以提出一种解决方法:使用实体的生命周期事件。否则,如果你使用Hibernate / SessionFactory,你应该看看Hibernate的监听器。这是相同的原则。

我们的想法是保留您的实际映射并添加一个包含您希望的数据的瞬态列表,这些数据将在加载ParserTypesEntity时以自动方式填充。

因此,在ParserTypesEntity中,您可以添加一个钩子方法来在加载实体时进行处理。在此方法中,您可以收集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());
   }
  ...
}