有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

@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 {
}

每个子类也有自己的repository类,其外观如下:

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);
        }
    }
}

。。同样适用于歌手、鼓手等

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


共 (1) 个答案

  1. # 1 楼答案

    你可以试着用类似的东西

    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);
            }
        }
    }