我正在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离开的地方开始(我确认无论添加多少学生,它们始终是连续的)。
我已经为此奋斗了好几天,并且几乎没有想法。我正在做的任何事情明显跳出错误吗?