Java hibernate-更新非id外键
我对hibernate还比较陌生,但我需要做一对一的映射, 我有一个表Java hibernate-更新非id外键,java,mysql,hibernate,one-to-one,Java,Mysql,Hibernate,One To One,我对hibernate还比较陌生,但我需要做一对一的映射, 我有一个表resources,它有一个外键res\u music\u id到表music经过大量搜索和调整后,我成功了,但仍然存在一个问题:更新了resources的id,但没有更新res\u music\u id的值;因此,每次我调用资源的索引时,它都会在音乐中为我提供相同的唱片。所以我也需要动态地更改res\u music\u id,我该怎么做呢?。顺便说一下,我有一个mySQL数据库。 这是我的密码: 资源 音乐 package
resources
,它有一个外键res\u music\u id
到表music
经过大量搜索和调整后,我成功了,但仍然存在一个问题:更新了
resources
的id,但没有更新res\u music\u id
的值;因此,每次我调用资源的索引时,它都会在音乐中为我提供相同的唱片。所以我也需要动态地更改res\u music\u id
,我该怎么做呢?。顺便说一下,我有一个mySQL数据库。
这是我的密码:
资源
音乐
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
我知道,我不擅长“干净代码”
提前感谢在父实体(资源)中,您将连接(使用@JoinColumn)定义为insertable=false,Updateable=false,因此创建/分配相关实体的责任不在当前实体中。在父实体(资源)中,您将连接(使用@JoinColumn)定义为insertable=false,updateable=false,因此创建/编辑相关实体的责任不在当前实体中
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