java - @OneToMany/@ManyToOne 如何使用表单保存数据

标签 java spring-mvc spring-data-jpa spring-data

我是新手,希望在使用表单将一些数据保存在数据库中时获得一些帮助。 我已经完成了一些工作,即两个 @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/

相关文章:

java - 致命异常 : main java. lang.RuntimeException:内容的 id 属性为 'android.R.id.list' 的 View 不是 ListView 类

java - Intellij IDEA 中花哨的代码注释

java - 如何在 jTable 中添加对列进行排序的函数?

java - 具有多个 Controller 的 Spring Boot API?

java - 如何使用 Spring Data REST 的多态关联

spring - Spring JPA 存储库 save() 有时会进行更新吗?

spring - 为什么Springboot的JPA实体是抽象的?

java - 是否可以以编程方式将文件从 Android 智能手机发送到计算机/PC?

java - Spring 存储库还保存了我不想保存的对象

Spring Boot 2.0.0 迁移 - JPA 存储库保存问题