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

标签 java hibernate jpa many-to-one

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

相关文章:

java - GWT 开发模式 - 无法在 Chrome 中加载模块

java - 如果使用密码,Hibernate无法登录MySQL

java - 我需要在 perl/java 中编写一段代码,在 1 秒内打印名称 100 次

java - Dijkstra算法方法返回空路径

hibernate - 使用 JPA 和 Hibernate 生成 SQLite 动态数据库和数据填充

java - Hql如何更新有限制的表?

java - 了解 JPA 延迟加载

java - 没有为实体指定标识符 : content. ContentType

spring - 超过 2 个方法的多个 @Transactional 注释不起作用

java - JFrame 不允许我 drawString();