hibernate - 更新非id外键

时间:2016-03-27 20:32:47

标签: java mysql hibernate one-to-one

我对hibernate相当新,但我需要进行一对一的映射, 我有一个表resources,表res_music_id有一个外键music。在经过大量搜索和调整之后,我让它工作但仍有一个问题:resources的ID已更新,但res_music_id的值不是;所以,每次我调用resources的索引时,它都会在music中给出相同的记录。所以我需要动态更改res_music_id,我该怎么做?顺便说一句,我在mySQL中有一个数据库。 这是我的代码:

资源

package database;

import com.sun.istack.internal.NotNull;
import org.hibernate.annotations.*;
import org.hibernate.annotations.Parameter;

import javax.persistence.*;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Arrays;

/**
 * @author Jari Van Melckebeke
 */
@Entity
@Table(name = "resources", catalog = "teresaDB")
public class Resources implements Serializable {

    private int resId;
    private String sort;
    private String location;
    private int resMusicId;
    private Music music;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "res_id")
    public int getResId() {
        return resId;
    }

    @Column(name = "res_sort")
    public String getSort() {
        return sort;
    }

    @Column(name = "res_location")
    public String getLocation() {
        return location;
    }


    @GenericGenerator(name = "gen", strategy = "property", parameters = @Parameter(name = "property",value = "id"))
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "gen")
    @Column(name = "res_music_id")
    public int getResMusicId() {
        return resMusicId;
    }


    public void setResId(int resId) {
        this.resId = resId;
    }

    public void setSort(String sort) {
        this.sort = sort;
    }

    public void setLocation(String location) {
        this.location = location;
    }


    public void setMusic(Music music) {
        this.music = music;
    }

    public void setResMusicId(int resMusicId) {
        this.resMusicId = resMusicId;
    }

    @Override
    public String toString() {
        return Arrays.toString(new String[]{"id:" + getResId(), "sort:" + getSort(), "location:" + getLocation(), "music-id:" + getResMusicId()});
    }


    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(referencedColumnName = "id", name = "res_music_id", insertable = false, updatable = false)
    public Music getMusic() {
        return music;
    }
}

音乐

package database;

import org.hibernate.annotations.*;

import javax.annotation.Nullable;
import javax.persistence.*;
import javax.persistence.AccessType;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Arrays;

/**
 * @author Jari Van Melckebeke
 */
@Entity
@Table(name = "music", catalog = "teresaDB")
public class Music implements Serializable {

    private int musicId;
    private String musicName;
    private String musicArtist;
    private String musicAlbum;
    private Resources resources;

    @Column(name = "track")
    public String getMusicName() {
        return musicName;
    }

    @Column(name = "artist")
    public String getMusicArtist() {
        return musicArtist;
    }

    @Id
    @Access(value = AccessType.PROPERTY)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int getMusicId() {
        return musicId;
    }


    @Column(name = "album")
    @Nullable
    public String getMusicAlbum() {
        return musicAlbum;
    }


    public void setMusicId(int musicId) {
        this.musicId = musicId;
    }

    public void setMusicAlbum(String musicAlbum) {
        this.musicAlbum = musicAlbum;
    }

    public void setMusicArtist(String musicArtist) {
        this.musicArtist = musicArtist;
    }

    public void setMusicName(String musicName) {
        this.musicName = musicName;
    }

    @Override
    public String toString() {
        return Arrays.toString(new String[]{"id:" + getMusicId(), "track:" + getMusicName(), "artist:" + getMusicArtist(), "album:" + getMusicAlbum()});
    }

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(referencedColumnName = "res_music_id", name = "id", insertable = false, updatable = false)
    public Resources getResources() {
        return resources;
    }

    public void setResources(Resources resources) {
        this.resources = resources;
    }
}

mySQL的

CREATE TABLE `resources` (
  `res_id` int(11) NOT NULL AUTO_INCREMENT,
  `res_sort` varchar(255) DEFAULT NULL,
  `res_location` varchar(255) DEFAULT NULL,
  `res_music_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`res_id`),
  KEY `mus_ind` (`res_music_id`),
  CONSTRAINT `resources_ibfk_1` FOREIGN KEY (`res_music_id`) REFERENCES `music` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

CREATE TABLE `music` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `track` varchar(255) DEFAULT NULL,
  `artist` varchar(255) DEFAULT NULL,
  `album` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

我知道,我并不擅长清洁代码'

提前致谢

1 个答案:

答案 0 :(得分:0)

在您的父实体(Resource)中,您将连接(使用@JoinColumn)定义为insertable = false,updatable = false,因此创建/更新相关实体的责任不在当前实体中。