Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免在hibernate的所有列上保存或更新_Java_Mysql_Hibernate - Fatal编程技术网

Java 如何避免在hibernate的所有列上保存或更新

Java 如何避免在hibernate的所有列上保存或更新,java,mysql,hibernate,Java,Mysql,Hibernate,嗨,我有一个类登录: public class Login { @Id @GeneratedValue @Column(name = "user_id") private int userId; @Column(name = "user_name", nullable=false ) private String userName; @Column(name = "password", nullable=false ) private String password; @ManyToMa

嗨,我有一个类登录:

public class Login {

@Id
@GeneratedValue
@Column(name = "user_id")
private int userId;

@Column(name = "user_name", nullable=false )
private String userName;

@Column(name = "password", nullable=false )
private String password;

@ManyToMany
@JoinTable(name = "user_songs_mapping", joinColumns = @JoinColumn(name = " user_id", 
referencedColumnName = "user_id"), inverseJoinColumns = @JoinColumn(name = "song_id", 
referencedColumnName = "song_id"))
private List<Song> songs;
}
公共类登录{
@身份证
@生成值
@列(name=“user\u id”)
私有int用户id;
@列(name=“user\u name”,null=false)
私有字符串用户名;
@列(name=“password”,null=false)
私有字符串密码;
@许多
@JoinTable(name=“user\u songs\u mapping”,joinColumns=@JoinColumn(name=“user\u id”,
referencedColumnName=“user\u id”),inverseJoinColumns=@JoinColumn(name=“song\u id”,
referencedColumnName=“song_id”))
私人列表歌曲;
}

当我必须向其中添加歌曲时,我会创建一个登录对象,并设置歌曲列表、用户名、密码和用户id,然后说session.saveOrUpdate(登录)。我只希望在映射表(user\u songs\u mapping)中映射用户id和歌曲id,但每次都会更新密码、用户名。如何避免这种情况?

Hibernate完全按照您的指示执行:您要求它更新登录名,此登录名的用户名和密码为空,因此它会更新登录名并将用户名和密码设置为空。它无法猜测您是否真的想要更新现有登录对象的歌曲,除非您告诉它这样做:

Login existingLogin = (Login) session.get(Login.class, userId);
existingLogin.addSong(song);

该代码完成了您想要执行的操作:向现有登录对象添加一首歌曲,该对象已具有用户ID、用户名和密码,且应保持原样。

Hibernate完全按照您的要求执行:您要求它更新登录,该登录的用户名和密码为空,因此,它会更新登录名并将用户名和密码设置为null。它无法猜测您是否真的想要更新现有登录对象的歌曲,除非您告诉它这样做:

Login existingLogin = (Login) session.get(Login.class, userId);
existingLogin.addSong(song);

该代码完成了您想要执行的操作:向现有登录对象添加一首歌曲,该对象已经有一个用户ID、用户名和密码,应该保持原样。

您所经历的是saveOrUpdate的正常行为,不能轻易更改

理想情况下,你应该做的是

  • 通过用户ID获取登录信息
  • 仅更改歌曲列表
  • 调用saveOrUpdate

  • 您所经历的是saveOrUpdate的正常行为,无法轻松更改

    理想情况下,你应该做的是

  • 通过用户ID获取登录信息
  • 仅更改歌曲列表
  • 调用saveOrUpdate

  • 第三步是无用的。在事务结束时(或之前),对托管实体所做的所有更改都会透明地持久化。第三步是无用的。在事务结束时(或之前),对托管实体所做的所有更改都将透明地持久化。谢谢。成功了。我现在有另一个问题。每次我说save(不是save或update),在user_songs_映射表中,它都会删除userId匹配的旧条目并添加新条目。我不想删除旧条目。这样,用户的帐户中只能有一首歌,这不是我想要的。我想我知道发生了什么。我是在做login.setSongs()而不是login.addSong()。谢谢。成功了。我现在有另一个问题。每次我说save(不是save或update),在user_songs_映射表中,它都会删除userId匹配的旧条目并添加新条目。我不想删除旧条目。这样,用户的帐户中只能有一首歌,这不是我想要的。我想我知道发生了什么。我在做login.setSongs()而不是login.addSong()。