@ManyToOne @OneToMany

转载:@ManyToOne 

@ManyToOne注解的这端,是多端

1.在注释@ManyToOne(cascade=CascadeType.REFRESH,optional=true)中将属性optional设置为true,这可以使得即使外键为空时仍可以向表中添加数据。

2.假设Person和Book是一对多的关系,其中Person的成员变量为:

private Integer personId;

private String name;

private Short age;

private List<Book> bookList=new ArrayList<Book>();

对应在MySql中表的结构为:Person(personId,name,age),不必有bookList一项,在getBookList上方通过注释: @OneToMany(mappedBy="person",cascade=CascadeType.ALL)

@OrderBy(value="bookId ASC")

与Book关系形成一对多的关系。Book的成员变量是:

private int bookId;

private String title;

private double price;

private Person person;

对应在MySql中表的结构为:Book(bookId,title,price,personId),注意要有Person表的主键personId,这样在插入记录时才不会产生异常。在getPerson上方有注释:

@ManyToOne(cascade=CascadeType.REFRESH,optional=true)

@JoinColumn(name="personId")

与@OneToMany形成呼应。

在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"));

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: @onetomany@manytoone是Hibernate框架中的注解,用于描述实体类之间的关系。 @onetomany表示一对多的关系,即一个实体类对应多个另一个实体类的对象。例如,一个班级对应多个学生,可以使用@onetomany注解来描述这种关系。 @manytoone表示多对一的关系,即多个实体类对应一个另一个实体类的对象。例如,多个订单对应一个客户,可以使用@manytoone注解来描述这种关系。 ### 回答2: @onetomany@manytoone是数据库中两种常见的关系映射,用来描述表与表之间的关系。其中,@onetomany表示一个实体与多个实体的关系,@manytoone表示多个实体与一个实体的关系。 @onetomany关系映射可以理解为“一对多”的关系,也就是说一个表中的记录可以对应到另一个表中的多条记录。比如说,一个学院可以有多个专业,那么学院表和专业表之间就可以使用@onetomany来描述这种关系。在实际操作中,通常会在多的那一方定义一个外键,用来关联到“一”的那一方的主键上。 @manytoone关系映射则可以理解为“多对一”的关系,也就是说多个表中的记录可以对应到另一个表中的同一条记录。比如说,多个学生可以属于同一个班级,那么学生表和班级表之间就可以使用@manytoone来描述这种关系。在实际操作中,通常会在“多”那一方定义一个外键,用来关联到“一”的那一方的主键上。 需要注意的是,@onetomany@manytoone只是关系映射的一种方式,在实际应用中还需要根据具体情况来选择适合的方式。此外,在使用时还需要注意关系的维护和数据的一致性,避免出现关系错乱或者数据冗余等问题。 ### 回答3: @onetomany@manytoone是两种不同的映射关系,通常应用于关系型数据库中的表之间的联系。 @onetomany指的是一对多的关系,也就是说,一个实体(或对象)与另一个实体(或对象)之间存在一对多的关联关系。在关系型数据库中,这种关系通常通过外键来实现,也就是在多的一端(子表)中添加一列,该列保存着主表的主键,从而实现与主表的关联。应用程序中查询多的一端时,可以通过ORM框架将查询结果映射到对应的实体对象中,从而方便进行数据操作和处理。 @manytoone则与@onetomany相反,它指的是多对一的关系。在关系型数据库中,这种关系通常通过在多的一端(子表)中添加外键来实现。应用程序中,查询的结果和处理都与@onetomany类似。 这两种映射关系在企业级开发中非常常见,经常被用于开发各种业务系统。例如,在一个订单管理系统中,一个客户可以对应多个订单,这就是一个@onetomany的关系。而一个订单只能对应一个客户,这就是一个@manytoone的关系。只有深入理解这两种关系的含义和使用方法,才能在实际开发中灵活运用ORM框架。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值