java - 使用单表策略持久化 Hibernate 继承映射

标签 java hibernate single-table-inheritance

我使用单表策略来保存数据,我的(示例)结构如下所示:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Musician {

    @Id
    private Integer id;

    private String name;

    // getters, setters
}

具有这样的子类:

@Entity
public class MusicianGuitar extends Musician {
}

@Entity
public class MusicianVocals extends Musician {
}

每个子类也有自己的存储库类,如下所示:

public interface MusicianGuitarRepository extends JpaRepository<MusicianGuitar, Integer> {
}

public interface MusicianVocalRepository extends JpaRepository<MusicianVocal, Integer> {
}

我正在从源中读取它们的集合,但我想编写可重复使用的保存方法..这就是我目前拥有的:

private void saveGuitarists(List<MusicianGuitar> guitarists) {
    for (MusicianGuitar guitarist : guitarists) {
        MusicianGuitar existingGuitarist = guitaristRepository.findByName(guitarist.getName());
        if (existingGuitarist == null) {
            MusicianGuitar newGuitarist = new MusicianGuitar();
            newGuitarist.setName("Slash");
            guitaristRepository.save(newGuitarist);
        }
    }
}

.. 与 saveVocalists、saveDrummers 等类似

问题是我必须为我当前拥有的每种类型的音乐家编写这种方法,并且如果稍后添加新类型,则必须再次编写它 - 在这个示例和我的实际示例中,对象具有所有相同的字段,它们只是不同的类型。我考虑过传递 Musician 枚举类型,但这并没有让事情变得更简单。我怀疑有某种方法可以利用继承映射,但不知道如何......提前致谢!

最佳答案

你可以尝试使用类似的东西

private void saveGuitarists(List<? extends Musician> musicians) {
   for (Musician musician : musicians) {
        Musician existingMusician = musicianRepository.findByName(musician.getName());
        if (existingMusician == null) {
            // create Musician and populate fields
            musicianRepository.save(newMusician);
        }
    }
}

关于java - 使用单表策略持久化 Hibernate 继承映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59416815/

相关文章:

java - 在 Hibernate 中将 3 个实体连接在一起

hibernate - Grails-非空属性仅对并发用户引用空值或瞬时值错误

java - 开始日期和完成日期验证 - Entity Hibernate java

typescript - 在 TypeORM 单表继承中更新实体的类型

ruby-on-rails - STI 和多晶型物

hibernate - 使用鉴别器值查询数据库

java - fromJson 引发无法解析的日期异常

java - 如何运行maven目标目录中JAR文件中的java类?

java.lang.ClassNotFoundException : io. vertx.core.spi.metrics.Pool指标

java - 如何从 html 的下拉菜单中读取元素?