gpt4 book ai didi

java - 当没有要求时,Hibernate ManyToOne 总是级联

转载 作者:行者123 更新时间:2023-12-01 12:09:26 25 4
gpt4 key购买 nike

假设我有一个 User 表和一个 UserRecordInfo 表,它保存更改用户信息所采取的操作。例如:

用户:

|用户 ID |用户名|

|1 |测试|

和用户记录信息:

|用户记录信息ID |用户ID |行动|旧值 |新值 |

| 1 | 1 |更新名称 |旧测试 |测试2 |

| 2 | 1 |更新名称 |测试2 |测试|

显然在Java中,在设计对象时,我不想在User中拥有UserRecordInfo字段,因为每个用户可能有数百个UserRecordInfo。我所拥有的是:

@Entity
@Table(name="User")
public class User {
private userName;
@Column(name = "userName")
public String getUserName() {
System.out.println("getting username");
return userName;
}
...
}

@Entity
@Table(name="UserRecordInfo")
public class UserRecordInfo {
private User user;

@JoinColumn(name = "UserID") // using javax.persistence.JoinColumn
@ManyToOne(fetch = FetchType.LAZY) // using javax.persistence.ManyToOne
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}

}

我创建新 UserRecordInfo 的方式是:

User u = {get user from hibernate}
UserRecordInfo record = new UserRecordInfo();
record.setUser(u);
.setNewName("test1");
...

Session session = DBSessionHandler.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Serializable result = session.save(record);
tx.commit();
return result;
}
catch (HibernateException ex) {
ex.printStackTrace();
if (tx!=null) tx.rollback();
throw ex;
}
finally {
DBSessionHandler.close();
}

但是,似乎每当我插入新的 UserRecordInfo 时,用户对象总是会被触及( println 总是打印“获取用户名”)。为什么会发生这种情况?我做错了什么吗?

最佳答案

尝试在 @JoinColumn 注释中添加“updatable=false”属性。

您可能希望将 @ManyToOne 注释的获取类型标记为“Eager”。

此外,我建议您对字段进行注释而不是 getter。

UserRecordInfo 类看起来像:

@Entity
@Table(name="UserRecordInfo")
public class UserRecordInfo {

@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "UserID", nullable = false, updatable = false)
@NotNull
private User user;

public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}

“可更新”的文档如下:

(Optional) Whether the column is included in SQL UPDATE statements generated by the persistence provider.

这似乎是您想要解决的情况

关于java - 当没有要求时,Hibernate ManyToOne 总是级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27346582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com