在EJB3.0 规范中 多对一与一对多的双向关系, 多对一(就是@ManyToOne注解的这端,是多端哦不要搞混了)这端总是双向关联端的主题(owner)端, 而一对多端的关联注解为 @OneToMany(mappedBy=" " )其值是:多对一端的属性
demo:
被动方:其实也就是一方 或者说(OneToMany方)
@Entity
public class Customer extends AbstractEntity {
private String name;
@OneToMany(mappedBy="customer",cascade=CascadeType.ALL)
private Set<Order> orders;
public void addOrder(Order order){
if(orders == null){
orders = new HashSet<Order>();
}
orders.add(order);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
}
主动方:1.关系的维护方2.ManyToOne方3.多方
@Entity
@Table(name="orders")
public class Order extends AbstractEntity {
private String name;
@ManyToOne(cascade=CascadeType.ALL)
private Customer customer;
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
以上是实体
下面是测试用列哦
public void testCRUD() {
// 第一种情况: 调用的被动方的Dao 绑定主动方关系,但主动方没有绑定被动方
Customer entity = new Customer();
entity.setName("customer1");
Order order = new Order();
order.setName("order1");
entity.addOrder(order);
entity = customerDao.create(entity); // 这种情况下 orders.customer_id == null
//控制台的信息
//Hibernate: insert into Customer (name, id) values (?, ?)
//这里的customer_id 为null
//Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)
System.out.println("entity id = " + entity.getId());
System.out.println("order id = "+ order.getId());
System.out.println("1111********************** over");
// 第二种情况: 调用的被动方的Dao 绑定主动方关系,并且主动方也绑定被动方
entity = new Customer();
entity.setName("customer2");
order = new Order();
order.setName("order2");
entity.addOrder(order);
order.setCustomer(entity); //这里进行双向关联
entity = customerDao.create(entity);
//
//Hibernate: insert into Customer (name, id) values (?, ?)
//这里的customer_id 有值哦
//Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)
System.out.println("entity id = " + entity.getId());
System.out.println("order id = "+ order.getId());
System.out.println("2222********************** over");
// 第三种情况: 调用的主动方的Dao 绑定被动方关系,但是被东方不绑定主动方
entity = new Customer();
entity.setName("customer3");
order = new Order();
order.setName("order3");
order.setCustomer(entity); //绑定被动方
orderDao.create(order);
//Hibernate: insert into Customer (name, id) values (?, ?)
//Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)
System.out.println("entity id = " + entity.getId());
System.out.println("order id = "+ order.getId());
System.out.println("3333********************** over");
// 第四种情况: 调用的主动方的Dao 绑定被动方关系,并且被东方也绑定主动方
entity = new Customer();
entity.setName("customer4");
order = new Order();
order.setName("order4");
order.setCustomer(entity); //绑定被动方
orderDao.create(order);
System.out.println("entity id = " + entity.getId());
System.out.println("order id = "+ order.getId());
System.out.println("4444********************** over");
//Hibernate: insert into Customer (name, id) values (?, ?)
//Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)
//总结:经测验二三四种方法结果都是一样都能持久化到数据库,并且关系也建立好了
// 也就说只要主动方绑定了被动方关系就维护好了
}
*****************************************做级联删除测试************************************************************
public void testCascade(){
//1. 做个级联删除吧 测试删除主动方是否删除关联方
// 这里会级联删除主动方的关联对象,以及该关联对象(被动方)所关联的所有主动方都会被级联删除
orderDao.delete("order_id_1");
//Hibernate: delete from orders where id=?
// Hibernate: delete from orders where id=?
// Hibernate: delete from orders where id=?
// Hibernate: delete from orders where id=?
// Hibernate: delete from orders where id=?
// Hibernate: delete from Customer where id=?
assertNull( orderDao.findById("orderDao"));
//2. 做个级联删除吧 测试删除被动方是否删除关联方
//删除该被动方,以及所关联的所有主动方(维护关系方or多方)与上面的调用主动方的结果一样
//Hibernate: delete from orders where id=?
// Hibernate: delete from orders where id=?
// Hibernate: delete from orders where id=?
// Hibernate: delete from orders where id=?
// Hibernate: delete from orders where id=?
// Hibernate: delete from Customer where id=?
customerDao.delete("2");
assertNull( customerDao.findById("2"));
}
-----------------------------------------------------
@OneToMany(mappedBy="appointment",cascade=CascadeType.ALL)
@OrderBy(value="id DESC")
private List<UploadField> uploads;
表结构中含有appointment的id.
@ManyToOne(cascade=CascadeType.REFRESH,optional=true)
@JoinColumn(name="APPOINTMENT_ID")
private Appointment appointment;
相关推荐
在Java的持久化框架Hibernate中,`ManyToOne`关系是一种常见的关联映射方式,它表示一个实体类("一"端)拥有对另一个实体类("多"端)的多个实例的引用。在这个例子中,我们关注的是如何在Hibernate中配置和使用`...
3. **关系映射注解**:@OneToOne、@OneToMany、@ManyToOne和@ManyToMany分别用于一对一、一对多、多对一和多对多的关系映射,它们可以配合@JoinColumn或@JoinTable进一步配置关联细节。 4. **继承注解**:@...
在上面的代码中,`@ManyToOne`注解表明了"Student"到"Course"的Many-to-One关系,而`@JoinColumn`注解定义了外键字段,即在"Student"表中用于关联"Course"表的字段名。 配置好关联后,我们可以通过Hibernate的API...
详解Hibernate cascade级联属性的CascadeType的用法 cascade(级联) ...cascade表示级联操作,在hibernate配置注解@OneToOne,@OneToMany,@ManyToMany,@ManyToOne中的属性。 例如: @ManyToOne(c
本文将深入探讨Hibernate中的两个关键概念——注解声明的一对多(@OneToMany)和多对一(@ManyToOne)关系,以及如何在实际项目中应用它们。 一、Hibernate注解介绍 Hibernate通过注解简化了Java类与数据库表之间的...
4. @OneToOne和@ManyToOne:一对一关系的映射,@OneToOne比@ManyToOne更为特殊,因为它可以是单向或双向的。同样,可以通过@JoinColumn定义外键列。 5. @ManyToMany:用于处理多对多关系,需要一个中间表来保存两个...
2. **映射关系**:@ManyToOne、@OneToMany、@OneToOne、@ManyToMany等注解用于建立不同表之间的关联。 3. **懒加载(Lazy Loading)**:通过@LazyCollection注解实现关联对象的延迟加载。 4. **事务管理**:...
4. **继承策略**:@Inheritance和@Inheritance(strategy=InheritanceType.SINGLE_TABLE)等,用于定义实体继承时的表结构策略。 5. **懒加载**:@LazyCollection和@LazyGroup等,可以实现对关联数据的延迟加载,提高...
3. **关联注解**:@OneToOne、@OneToMany、@ManyToOne、@ManyToMany分别表示一对一、一对多、多对一、多对多的关联关系。例如: ```java @ManyToOne @JoinColumn(name = "user_id") private User user; ``` 4. **懒...
标题“SpringBoot-SpringData-ManyToOne”涉及到的是Spring Boot与Spring Data JPA在处理多对一关系时的应用。Spring Boot是Spring框架的一个轻量级版本,它简化了配置和项目初始化,使得开发者能够更快地开始开发...
4. **检索策略**:@GeneratedValue注解用于指定主键生成策略,如IDENTITY、SEQUENCE、TABLE等。 5. **缓存机制**:Hibernate的二级缓存可以通过注解配置,例如@Cacheable和@Cache。 6. **复杂类型和集合**:@...
3. **关系映射**:@OneToOne、@OneToMany、@ManyToOne、@ManyToMany注解分别用于一对一、一对多、多对一和多对多的关系映射,它们可以通过@JoinColumn或@JoinTable进行更详细的配置。 4. **继承策略**:@...
- 一对多:@ManyToOne和@OneToMany,一方通常设置@JoinColumn,另一方设置@ManyToOne。 - 多对多:@ManyToMany,通过中间表关联两个实体。 10. **性能优化** - 避免N+1查询:通过批处理或联合查询减少数据库访问...
- **实体间关系映射**:通过`@ManyToOne`、`@OneToOne`、`@OneToMany`等注解定义实体之间的关系,实现数据的一致性和完整性。 #### 六、总结 本项目通过对健身房后台管理系统的深入分析与设计,不仅实现了健身房...
在这个例子中,`Student`类中的`classInfo`字段用`@ManyToOne`注解,表示一个学生属于一个班级。`@JoinColumn`指定了外键字段`class_id`。 **四、级联操作和懒加载** 在处理一对多或多对一关系时,我们可能会遇到...
* 双向一对多映射:在多端使用 @ManyToOne 和 @JoinColumn 注解,在一端使用 @OneToMany 和 mappedBy 注解,指定关联属性名。 * 双线一对一映射:基于外键使用 @OneToOne 注解,基于主键使用 Hibernate 的扩展注解。...
在JPA中,"多对一"关系可以通过在实体类中定义`@ManyToOne`注解来实现。让我们深入探讨这个概念。 首先,我们需要理解实体(Entity)的概念。在JPA中,实体是数据库表的映射,通常由一个带有`@Entity`注解的Java类...
在`Student`类中,`@ManyToOne`注解表明`class`字段是一个多对一关系,`@JoinColumn`指定了外键所在的列名。 2. **配置表结构**: 在数据库中,`Student`表需要有一个外键字段`class_id`,指向`Class`表的`id`字段...