更新表 A 后休眠更新表 B

Posted

技术标签:

【中文标题】更新表 A 后休眠更新表 B【英文标题】:Hibernate update table B after table A is updated 【发布时间】:2011-09-28 07:10:22 【问题描述】:

我是 Hibernate 的新手,我有以下情况的问题。

用户类

@实体 @Table (name="user_table") 公共类用户实现可序列化 /** * */ 私有静态最终长序列版本UID = 1L; +getter 和 setter //按字段访问 //首要的关键 @ID @Column (name = "用户名") 私人字符串用户名; @Column(名称=“密码”) 私人字符串密码; @Column(名称=“电子邮件”) 私人字符串电子邮件; /** * 级联所有操作 */ @OneToMany(级联 = CascadeType.ALL) @JoinTable(name = "user_history_table", joinColumns = @JoinColumn(name = "username") , inverseJoinColumns = @JoinColumn(name = "history_id") ) 私有集 userHistory = new HashSet(0);

历史类

@实体 @Table (name="history_table") 公共课历史 +getter 和 setter //首要的关键 @ID @Column (name = "history_id") 私人 int id; @Column (name="url") 私人字符串网址; @Column(名称=“区域”) 私有字符串区域; @Column(名称=“来源”) 私有字符串源; @Column(名称=“目标”) 私有字符串目标; @Column(名称=“成本”) 私人双倍费用; @Column(名称=“余额”) 私人双重平衡;

架构

创建表 user_table( 用户名 varchar(50) NOT NULL PRIMARY KEY, 密码 varchar(20), 电子邮件 varchar(150) ); 创建表history_table( history_id INTEGER AUTO_INCREMENT 主键, url varchar(1000) NOT NULL, cur_timestamp 时间戳默认 now(), 区域 varchar (100) NOT NULL, 源 varchar(30) 非空, 目标 varchar(30) NOT NULL, 成本小数 (10,2) 非空, 余额小数 (10,2) NOT NULL ); 创建表 user_history_table( user_history_id 整数 AUTO_INCREMENT 主键, 用户名 varchar(50) 非空, history_id INTEGER NOT NULL, FOREIGN KEY (username) REFERENCES user_table(username), 外键 (history_id) 参考 history_table(history_id) );

应用类

公共类应用程序 公共静态无效主要(字符串[]参数) SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); 会话会话 = sessionFactory.getCurrentSession(); 交易 tx = session.beginTransaction(); System.out.println("插入记录"); 历史历史 = new History(); history.setBalance(1000); history.setCost(50.99); history.setRegion("区域"); history.setSource("Source_test"); history.setTarget("Target_test"); history.setUrl("http://***.com/"); session.save(历史); tx.commit(); System.out.println("完成");

App.java 将向 history_table 插入一个条目,但我也需要更新 user_history_table。所以,我应该创建另一个对象,比如 user_history_obj 并像 history_table 更新一样更新它,还是有一种休眠方式来做它。 谢谢。

【问题讨论】:

【参考方案1】:

UserHistory 之间的关系看起来有点像以 user_history 作为连接表的多对多关系。

这样映射可能会更好。请参阅Hibernate Annotations Reference on mapping associations 中有关@ManyToMany 的部分。

这将改变你的 user_history 表的布局,移除它的自动生成的主键。但它可能值得一试,它可能会使表格以合理合理的方式填充此关系。

编辑:

我现在不确定为什么我认为是多对多,但使用连接表将其映射为一对多可能没问题。创建 History 对象后,如果将其添加到 User 对象的 userHistory 集中,将创建 user_history_table 条目并与mergeUser 对象一起保存。

【讨论】:

谢谢,@ManyToMany 说得通,但我认为不需要删除 user_history_id 主节点。 不,它可能不必删除,但我认为如果你使用hibernate生成你的ddl,它不会生成。 不,抱歉。它不是多对多的,因为在与该用户关联的 history_table 中有余额、时间戳和成本列。

以上是关于更新表 A 后休眠更新表 B的主要内容,如果未能解决你的问题,请参考以下文章

使用休眠和弹簧更新

如何从数据库表中获取数据并将该数据更新到休眠中的另一个表中?我已经在 J​​SP 中完成了,但我想在 Hibernate 中完成

如何在休眠/弹簧中更新多对多集合(延迟加载)?

具有多个条件但 @WhereJoinTable 不起作用的休眠连接表

在休眠中的多对多映射中仅插入一个表

使用休眠为相互关联的表存储数据