假设我有一个 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/