`
kililanxilu
  • 浏览: 26195 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

OneToOne annotation级联更新及新增

阅读更多

前些天在做项目的时候需要用到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

分享到:
评论

相关推荐

    hibernate annotation 中文文档

    - `@Cascade`: 可以定义实体间的级联操作,如SAVE_UPDATE、DELETE等,使得操作父实体时,子实体也能相应更新或删除。 5. **懒加载与瞬时性** - `@LazyCollection`: 实现集合属性的懒加载,延迟加载直到真正需要时...

    最全的Hibernate Annotation API文档

    在Hibernate中,注解(Annotation)是一种声明式的方法,用于配置实体类、属性以及它们与数据库表之间的映射关系。本文将深入探讨“最全的Hibernate Annotation API文档”中的关键知识点。 一、实体类(Entity) 在...

    hibernate-Annotation.jar

    - `@OneToOne`:一对一关联,表示两个实体类之间存在一对一的关系。 - `@ManyToOne`:多对一关联,一个实体类的属性对应另一个实体类的多个实例。 - `@OneToMany`:一对多关联,一个实体类的实例对应另一个实体类...

    Hibernate Annotation 唯一外键一对一双向关联

    通过阅读《Hibernate_annotation_1to1_foreignKey》文档或博客,你可以更详细地了解如何配置和使用这种关联,包括示例代码、注意事项以及可能遇到的问题和解决方案。理解并熟练运用这些知识,能帮助你在使用...

    Hibernate Annotation入门

    6. `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:这些注解用于建立不同实体间的关联关系。 接下来,我们将逐步创建一个简单的Hibernate Annotation应用。首先,定义一个实体类,比如`User`: ```java...

    Hibernate-Annotation-3.4.0帮助文档

    《Hibernate-Annotation-3.4.0帮助文档》是一份详尽的指南,旨在帮助开发者理解和使用Hibernate ORM框架中的注解功能。Hibernate是Java领域中广泛使用的对象关系映射(ORM)工具,它极大地简化了数据库操作。在3.4.0...

    hibernate-annotation-3.4.0.GA

    1. @OneToOne:一对一关系 2. @ManyToOne:多对一关系 3. @OneToMany:一对多关系 4. @ManyToMany:多对多关系 这些注解用于处理不同类型的关联关系。例如,一个用户可以拥有多个角色,我们可以这样表示: ```java...

    Hibernate Annotation 学习笔记

    - **一对一关联 (@OneToOne)**: 使用`@OneToOne`注解建立两个实体之间一对一的关系。`mappedBy`属性用于指定被引用方的属性名。 - **一对多关联 (@OneToMany)**: 表示一个实体可以关联多个其他实体。`@JoinColumn`...

    hibernate annotation 3.40

    - `@ManyToOne`, `@OneToOne`, `@OneToMany`, `@ManyToMany`:这些注解用于定义不同类型的关联关系。 3. **使用示例** 一个简单的User类可能如下所示: ```java @Entity @Table(name = "users") public class...

    Hibernate-Annotation初步.rar

    此外,注解还支持更多的高级特性,比如关联映射(@OneToOne、@OneToMany、@ManyToOne、@ManyToMany)、级联操作、懒加载、索引和唯一性约束等,所有这些都可以在Java类中直接声明。 在【压缩包子文件的文件名称列表...

    Hibernate Annotation 共享主键一对一双向关联

    `CascadeType.ALL`表示所有操作(包括保存、更新、删除)都会级联到对方实体。 值得注意的是,虽然共享主键的一对一关联在某些情况下简化了设计,但也有其缺点,如可能导致数据冗余和违反数据库规范化原则。因此,...

    Hibernate Annotation应用

    6. **级联操作**:通过`CascadeType`枚举,可以定义级联操作,如`CascadeType.ALL`表示对实体的增删改查操作都会影响到关联的实体。 7. **继承映射**:Hibernate支持单表继承(SINGLE_TABLE)、联合继承(JOINED)...

    Hibernate Annotation 基于外键的单向多对一关联

    在实际应用中,我们还需要注意一些最佳实践,比如合理选择加载策略(EAGER vs LAZY),避免N+1查询问题,以及正确处理级联操作(如级联保存、删除等)。通过理解并熟练运用这些技巧,可以更高效地使用Hibernate进行...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    本文将深入探讨这两种关联方式在使用Hibernate时的配置,包括基于注解(Annotation)和XML的方式。 1. **一对多关联**(Many-to-One) - 在这种关系中,一个实体可以对应多个其他实体。例如,一个班级可以有多个...

    hibernate_annotation_api

    **hibernate_annotation_api** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。而Hibernate的注解API是其核心特性之一,允许开发者通过在Java类和属性上添加注解来...

    hibernate _annotation 注解编程

    ### Hibernate Annotation注解编程知识点详解 #### 一、概述与设置环境 - **概述**:Hibernate 是一个流行的 Java 持久层框架,它提供了一种面向对象的方式来处理数据库操作。Hibernate 支持多种元数据定义方式,...

    Hibernate annotation 详解

    `@Cascade`允许指定对关联对象进行的操作级联,如保存、更新、删除等。例如: ```java @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List<Order> orders; ``` 这表示当用户对象被保存或删除...

    Hibernate关联关系的CRUD和集合映射(annotation)

    3. **更新**:修改对象的属性后,调用`Session.update()`或`Session.saveOrUpdate()`,让Hibernate自动更新数据库。 4. **删除**:使用`Session.delete()`方法删除对象,对应的数据库记录也会被移除。 ### 集合...

Global site tag (gtag.js) - Google Analytics