一对多和多对休眠ORM

时间:2018-09-25 18:16:25

标签: mysql hibernate orm

我正在Docker容器中运行带有MySQL的Spring Boot应用,而我正在努力解决Hibernate ORM映射。我有部分解决方案,但不能完全克服困难。我正在尝试定义学生摇滚乐队的成员之间的关系,以及每种乐器在哪些歌曲上演奏。实体如下(为简单起见,仅显示基本属性):

学生有一个ID,姓名,一套乐器和铸件清单。

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @ElementCollection(targetClass = Instrument.class)
    @Enumerated(value = EnumType.STRING)
    private Set<Instrument> instruments;

    @ElementCollection(targetClass = Casting.class)
    @OneToMany(mappedBy = "student")
    private List<Casting> castings; 
}

乐器是由5个常见的摇滚乐队部分组成的枚举。

public enum Instrument {
    VOCALS, GUITAR, BASS, KEYS, DRUMS
}

铸造有一个ID,一首歌曲,一个学生和一个乐器。目的是使学生与特定乐曲上的乐器匹配。这是事情开始向南的地方。

@Entity
public class Casting {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    private Song song;

    @Enumerated(value = EnumType.STRING)
    private Instrument instrument;

    @ManyToOne(cascade = CascadeType.ALL)
    private Student student;
}

歌曲具有ID,标题和演员表。

@Entity
public class Song {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @ElementCollection(targetClass = Casting.class)
    @OneToMany
    private List<Casting> castings;
}

Thymeleaf模板允许用户指定歌曲的详细信息和类型($ allStudents和$ allInstruments变量由Controller放入模型中)。

<div class="form-group">
    <label>Title</label>
    <input th:field="*{title}" class="form-control" type="text" placeholder="Enter title">
</div>

<div class="input-group" th:each="casting, itemStat : *{castings}">

    <div class="input-group-prepend"><span class="input-group-text">Instrument</span></div>

    <select class="form-control" th:field="*{castings[__${itemStat.index}__].instrument}"><option th:each="instrument : ${allInstruments}" th:text="${instrument}" th:value="${instrument}">Instrument</option></select>

    <div class="input-group-prepend"><span class="input-group-text">Student</span></div>

    <select class="form-control" th:field="*{castings[__${itemStat.index}__].student}"><option th:each="student : ${allStudents}" th:text="${student.getFullName()}" th:value="${student.id}">Student</option></select>

</div>

提交一些示例数据后,我得到以下表格:

STUDENT
id   name 
1    Andrew 
2    Grace 
3    Mayzie

STUDENT_INSTRUMENTS
student_id  instruments
1           DRUMS
1           BASS
2           GUITAR
2           VOCALS
3           KEYS
3           VOCALS

SONG
id   title
1    Welcome to the Jungle
2    Oh Pretty Woman
3    Blinded by the Light

CASTING
id   instrument  song_id  student_id
4    DRUMS       (NULL)   1
5    GUITAR      (NULL)   2
6    VOCALS      (NULL)   3

我的测试数据输入应该导致安德鲁在《欢迎来到丛林》上的鼓上,格蕾丝在《噢漂亮女人》上的吉他上以及梅西在《被光明蒙蔽》上的人声上。学生和乐器已正确存储在演员表中,但song_id却没有。此外,我配置实体的方式显然有问题,因为自动生成的演员表ID从4开始,从学生ID离开的地方开始(我确认无论添加多少学生,它们始终是连续的)。

我已经为此奋斗了好几天,并且几乎没有想法。我正在做的任何事情明显跳出错误吗?

0 个答案:

没有答案
相关问题