前些天在做项目的时候需要用到Hibernate的级联保存和更新,出现了几个错误,已经解决了这里记上一笔。
首先是实例:
@Entity
@Table(name = "tbl_order")
public class Order {
@Id
@GeneratedValue(generator = "ORDER_ID")
@GenericGenerator(strategy = "assigned", name = "ORDER_ID")
private Integer id;
@OneToOne
@JoinColumn(name = "orderId")
private OperationTime operationTimes;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public OperationTime getOperationTimes() {
return operationTimes;
}
public void setOperationTimes(OperationTime operationTimes) {
this.operationTimes = operationTimes;
}
}
@Entity
@Table(name = "tbl_order_extension")
public class OperationTime {
@Id
@GeneratedValue(generator = "ORDER_ID")
@GenericGenerator(strategy = "assigned", name = "ORDER_ID")
private Integer orderId;
@Column(name = "apply_time")
private Date applyTime;
@Column(name = "accept_time")
private Date acceptTime;
@OneToOne
@JoinColumn(name = "id")
private Order order;
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public Date getApplyTime() {
return applyTime;
}
public void setApplyTime(Date applyTime) {
this.applyTime = applyTime;
}
public Date getAcceptTime() {
return acceptTime;
}
public void setAcceptTime(Date acceptTime) {
this.acceptTime = acceptTime;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
}
Order和OperationTime是一对一的映射关系,在级联保存的时候需要这样写:
public void saveOrder(Order order){
//business code
OperationTime operationTimes = new OperationTime();
operationTimes.setApplyTime(new Date());
operationTimes.setOrder(order);
//operationTimes.setOrderId(order.getId()); a
order.setOperationTimes(operationTimes);
orderDao.save(order);
}
千万不能像a处给operationTimes.orderId赋值,因为如果在这里能取到值Hibernate会默认执行update语句这样就会出现错误。
Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
但是不赋值我的副类主键是需要分配的,且是主键关联,需要将其主键生成策略做下修改。
@Id
@GeneratedValue(generator = "foreign")
@GenericGenerator(name = "foreign", strategy = "foreign",
parameters = {
@Parameter(name = "property", value = "order")
})
private Integer orderId;
同理在更新的时候一定别忘了为operationTimes.orderId赋值,否则将会执行create语句。因为我这里是分配的主键策略是assigned的会报ids must be manually assigned
分享到:
相关推荐
- `@Cascade`: 可以定义实体间的级联操作,如SAVE_UPDATE、DELETE等,使得操作父实体时,子实体也能相应更新或删除。 5. **懒加载与瞬时性** - `@LazyCollection`: 实现集合属性的懒加载,延迟加载直到真正需要时...
在Hibernate中,注解(Annotation)是一种声明式的方法,用于配置实体类、属性以及它们与数据库表之间的映射关系。本文将深入探讨“最全的Hibernate Annotation API文档”中的关键知识点。 一、实体类(Entity) 在...
- `@OneToOne`:一对一关联,表示两个实体类之间存在一对一的关系。 - `@ManyToOne`:多对一关联,一个实体类的属性对应另一个实体类的多个实例。 - `@OneToMany`:一对多关联,一个实体类的实例对应另一个实体类...
通过阅读《Hibernate_annotation_1to1_foreignKey》文档或博客,你可以更详细地了解如何配置和使用这种关联,包括示例代码、注意事项以及可能遇到的问题和解决方案。理解并熟练运用这些知识,能帮助你在使用...
6. `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:这些注解用于建立不同实体间的关联关系。 接下来,我们将逐步创建一个简单的Hibernate Annotation应用。首先,定义一个实体类,比如`User`: ```java...
《Hibernate-Annotation-3.4.0帮助文档》是一份详尽的指南,旨在帮助开发者理解和使用Hibernate ORM框架中的注解功能。Hibernate是Java领域中广泛使用的对象关系映射(ORM)工具,它极大地简化了数据库操作。在3.4.0...
1. @OneToOne:一对一关系 2. @ManyToOne:多对一关系 3. @OneToMany:一对多关系 4. @ManyToMany:多对多关系 这些注解用于处理不同类型的关联关系。例如,一个用户可以拥有多个角色,我们可以这样表示: ```java...
- **一对一关联 (@OneToOne)**: 使用`@OneToOne`注解建立两个实体之间一对一的关系。`mappedBy`属性用于指定被引用方的属性名。 - **一对多关联 (@OneToMany)**: 表示一个实体可以关联多个其他实体。`@JoinColumn`...
- `@ManyToOne`, `@OneToOne`, `@OneToMany`, `@ManyToMany`:这些注解用于定义不同类型的关联关系。 3. **使用示例** 一个简单的User类可能如下所示: ```java @Entity @Table(name = "users") public class...
此外,注解还支持更多的高级特性,比如关联映射(@OneToOne、@OneToMany、@ManyToOne、@ManyToMany)、级联操作、懒加载、索引和唯一性约束等,所有这些都可以在Java类中直接声明。 在【压缩包子文件的文件名称列表...
`CascadeType.ALL`表示所有操作(包括保存、更新、删除)都会级联到对方实体。 值得注意的是,虽然共享主键的一对一关联在某些情况下简化了设计,但也有其缺点,如可能导致数据冗余和违反数据库规范化原则。因此,...
6. **级联操作**:通过`CascadeType`枚举,可以定义级联操作,如`CascadeType.ALL`表示对实体的增删改查操作都会影响到关联的实体。 7. **继承映射**:Hibernate支持单表继承(SINGLE_TABLE)、联合继承(JOINED)...
在实际应用中,我们还需要注意一些最佳实践,比如合理选择加载策略(EAGER vs LAZY),避免N+1查询问题,以及正确处理级联操作(如级联保存、删除等)。通过理解并熟练运用这些技巧,可以更高效地使用Hibernate进行...
本文将深入探讨这两种关联方式在使用Hibernate时的配置,包括基于注解(Annotation)和XML的方式。 1. **一对多关联**(Many-to-One) - 在这种关系中,一个实体可以对应多个其他实体。例如,一个班级可以有多个...
**hibernate_annotation_api** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。而Hibernate的注解API是其核心特性之一,允许开发者通过在Java类和属性上添加注解来...
### Hibernate Annotation注解编程知识点详解 #### 一、概述与设置环境 - **概述**:Hibernate 是一个流行的 Java 持久层框架,它提供了一种面向对象的方式来处理数据库操作。Hibernate 支持多种元数据定义方式,...
`@Cascade`允许指定对关联对象进行的操作级联,如保存、更新、删除等。例如: ```java @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List<Order> orders; ``` 这表示当用户对象被保存或删除...
3. **更新**:修改对象的属性后,调用`Session.update()`或`Session.saveOrUpdate()`,让Hibernate自动更新数据库。 4. **删除**:使用`Session.delete()`方法删除对象,对应的数据库记录也会被移除。 ### 集合...