Spring Data JPA - 将基类插入存储库

时间:2016-10-27 13:51:21

标签: java repository spring-data-jpa

我有一个小应用程序是RabbitMQ和SQL数据库之间的桥梁。它意味着从队列中消耗(少数类型的)事件并将它们存储在DB中的适当表中。在大多数情况下,事件和实体之间几乎没有处理(只是字段复制)。这就是为什么我注入了一个Dozer映射器进行转换的原因 - 它可以完美地工作。困难的部分是将通用对象保存到存储库,而不必使用switch + instanceof作为最后的手段。

代码:

@Service
public class EventProcessorImpl implements EventProcessor {

    @Autowired
    private Mapper mapper; // a Dozer mapper instance

    @Override
    public void process(final BaseEvent event) {
        final BaseEntity entity = mapper.map(event, BaseEntity.class);

        // TODO save the entity to the database after it's transformed
    }
}

BaseEntity是entites的基类,如下所示:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {

    @Id
    private String guid;

    public String getGuid() {
        return guid;
    }

    public void setGuid(final String guid) {
        this.guid = guid;
    }
}
@NoRepositoryBean
public interface BaseRepository<T extends BaseEntity>
                 extends CrudRepository<T, String> {
}
@Repository
public interface EmailOpenedRepository
                 extends BaseRepository<EmailOpened> {
}

问题是 - 如何保存实体,因为:

  1. 它作为基类传递(我认为这是一个优势,但这可以改变)
  2. 有相当多的事件类型(现在5个,但可能在几个月内爆炸到30个)
  3. 我尝试过:

    1. 我有@Autowired BaseRepository的实例并尝试调用repository.save(entity),但由于有多个bean定义,它在应用启动时失败。
    2. 根据question,我已成功实施以下内容,但我不知道这是否是正确的方法:

      public void process(final BaseEvent event) {
          final BaseEntity entity = mapper.map(event, BaseEntity.class);
          final CrudRepository repository = (CrudRepository) new Repositories(context)
                      .getRepositoryFor(entity.getClass());
      
          repository.save(entity);
      }
      
    3. 我想过迭代BaseRepository的所有可用bean并找到支持这种类型的bean findFirst(repository -> repository.supports(entity.getType())),但Spring Data JPA存储库是接口,我无法存储支持的类型在界面中。

0 个答案:

没有答案