我是新手,希望在使用表单将一些数据保存在数据库中时获得一些帮助。 我已经完成了一些工作,即两个 @Entity 类
@Entity
public class Artist {
@Id
@GeneratedValue
private Integer id;
private String name;
@OneToMany(mappedBy = "artist")
private List<Song> songs;
// setters and getters goes here
}
和
@Entity
public class Song{
@Id
@GeneratedValue
private Integer id;
private String title;
@ManyToOne
@JoinColumn(name = "artist_id")
private Artist artist;
// setters an getters goes here
}
和两个存储库
public interface ArtistRepository extends JpaRepository<Artist, Integer> {
}
和
public interface SongRepository extends JpaRepository<Song, Integer> {
List<Song> findByArtist(Artist artist);
}
我可以使用以下类保存数据
@Transactional
@Service
public class DatabaseServiceInitializer {
@Autowired
private ArtistRepository artistRepository;
@Autowired
private SongRepository songRepository;
@PostConstruct
public void dbInitializer() {
Artist artist1 = new Artist();
artist1.setName("Rock Star");
artistRepository.save(artist1);
Song song1 = new Song();
song1.setTitle("Stand Up for Rock Star"); // Dummy/fake song name
song1.setArtist(artist1);
songRepository.save(song1);
Song song2 = new Song();
song2.setTitle("Sit Down for Looser"); // Dummy/fake song name
song2.setArtist(artist1);
songRepository.save(song1);
}
}
并使用取回此数据
@Service
public class ArtistService{
@Autowired
private ArtistRepository artistRepository;
@Autowired
private SongRepository songRepository;
@Override
public List<Artist> findAll() {
return artistRepository.findAll();
}
public Job findArtistById(Integer id) {
return artistRepository.findOne(id);
}
public Artist findArtistWithSong(Integer id) {
Artist artist= findArtistById(id);
artist.setSongs(songRepository.findByJob(artist));
return artist;
}
}
使用此 Controller
@Controller
public class ArtistController {
@Autowired
private ArtistService artistService;
@RequestMapping(value = "/artists", method = RequestMethod.GET)
public String showArtists(Model model) {
model.addAttribute("artists", artistServicefindAll());
return "artists";
}
}
我在 arts.jsp 中将其视为
<c:forEach items="${artists}" var="artist">
<a href='<spring:url value="/artists/${artist.id}"/>'> ${artist.name} </a>
</c:forEach>
并在上面的 Controller 中添加另一种方法来查看艺术家与歌曲的详细信息
@RequestMapping(value = "/artists/{id}", method = RequestMethod.GET)
public String showArtistDetail(Model model, @PathVariable Integer id) {
model.addAttribute("artist", artistService.findArtistbWithSongs(id));
return "artist-detail";
}
和artist-detail.jsp就这么简单
<h1>
${artist.name }
</h1>
<ul>
<c:forEach items="${artist.songs}" var="song">
<li>${song.title}</li>
</c:forEach>
</ul>
现在我想使用表单保存带有类别的新艺术家(已添加或添加新类别),但我不知道,我发现 This So Question answer但有很多我不想要的 JavaScript 东西,我想要简单的方法来使用表单保存 Artist。请提供任何帮助。
最佳答案
听起来您想使用 spring/java 等在服务器端完成这一切...如果您添加一个用户可以从中选择的类别字段,以及另一个用于添加新类别的字段;您可以在服务器上解析并知道传入的内容。如果您允许用户选择多个类别,则您无法逃避允许他们为新类别添加另一个字段的 JavaScript,除非您使用允许多个条目的文本区域或 jquery 插件。无论哪种方式,您都必须在服务器上解析它,以便您可以相应地在数据库中输入条目。
我会编写一个单独的服务来处理这个问题,并确保它是事务性的,这样如果由于某种原因无法插入新类别,则不会插入其他数据。我将重用您的代码来创建示例:
public void dbInitializer() {
// INSERT CATEGORY FIRST
Category c = new Category();
c.setName("Heavy Metal");
categoryRepository.save(c);
Artist artist1 = new Artist();
artist1.setName("Rock Star");
artistRepository.save(artist1);
Song song1 = new Song();
song1.setTitle("Stand Up for Rock Star"); // Dummy/fake song name
song1.setArtist(artist1);
song1.setCategory(c);
songRepository.save(song1);
Song song2 = new Song();
song2.setTitle("Sit Down for Looser"); // Dummy/fake song name
song2.setArtist(artist1);
song2.setCategory(c);
songRepository.save(song1);
}
确保注释类@Transactional
,您可能需要查看Using @Transactional并了解您需要配置什么。
关于java - @OneToMany/@ManyToOne 如何使用表单保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32441831/