`

【转】转载:@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"));

}

 

 

-----------------------------------------------------

 

 

    @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;

 

分享到:
评论
1 楼 壹零零玖贰捌壹叁玖叁 2015-10-14  
                 

相关推荐

    hibernate manytoone

    在Java的持久化框架Hibernate中,`ManyToOne`关系是一种常见的关联映射方式,它表示一个实体类("一"端)拥有对另一个实体类("多"端)的多个实例的引用。在这个例子中,我们关注的是如何在Hibernate中配置和使用`...

    hibernate-annotations-3.4.0.GA.chm中文版

    3. **关系映射注解**:@OneToOne、@OneToMany、@ManyToOne和@ManyToMany分别用于一对一、一对多、多对一和多对多的关系映射,它们可以配合@JoinColumn或@JoinTable进一步配置关联细节。 4. **继承注解**:@...

    hibernate 关联映射(一) many to one

    在上面的代码中,`@ManyToOne`注解表明了"Student"到"Course"的Many-to-One关系,而`@JoinColumn`注解定义了外键字段,即在"Student"表中用于关联"Course"表的字段名。 配置好关联后,我们可以通过Hibernate的API...

    详解Hibernate cascade级联属性的CascadeType的用法

    详解Hibernate cascade级联属性的CascadeType的用法 cascade(级联) ...cascade表示级联操作,在hibernate配置注解@OneToOne,@OneToMany,@ManyToMany,@ManyToOne中的属性。 例如: @ManyToOne(c

    Hibernate 注解一对多,多对一

    本文将深入探讨Hibernate中的两个关键概念——注解声明的一对多(@OneToMany)和多对一(@ManyToOne)关系,以及如何在实际项目中应用它们。 一、Hibernate注解介绍 Hibernate通过注解简化了Java类与数据库表之间的...

    hibernate注解处理映射关系共14页.pdf.zip

    4. @OneToOne和@ManyToOne:一对一关系的映射,@OneToOne比@ManyToOne更为特殊,因为它可以是单向或双向的。同样,可以通过@JoinColumn定义外键列。 5. @ManyToMany:用于处理多对多关系,需要一个中间表来保存两个...

    基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发 (1)

    2. **映射关系**:@ManyToOne、@OneToMany、@OneToOne、@ManyToMany等注解用于建立不同表之间的关联。 3. **懒加载(Lazy Loading)**:通过@LazyCollection注解实现关联对象的延迟加载。 4. **事务管理**:...

    hibernate-commons-annotations-3.1.0.ga.jar.zip

    4. **继承策略**:@Inheritance和@Inheritance(strategy=InheritanceType.SINGLE_TABLE)等,用于定义实体继承时的表结构策略。 5. **懒加载**:@LazyCollection和@LazyGroup等,可以实现对关联数据的延迟加载,提高...

    hibernate-annotations和slf4j

    3. **关联注解**:@OneToOne、@OneToMany、@ManyToOne、@ManyToMany分别表示一对一、一对多、多对一、多对多的关联关系。例如: ```java @ManyToOne @JoinColumn(name = "user_id") private User user; ``` 4. **懒...

    SpringBoot-SpringData-ManyToOne

    标题“SpringBoot-SpringData-ManyToOne”涉及到的是Spring Boot与Spring Data JPA在处理多对一关系时的应用。Spring Boot是Spring框架的一个轻量级版本,它简化了配置和项目初始化,使得开发者能够更快地开始开发...

    一些常用的有关java的chm文档

    4. **检索策略**:@GeneratedValue注解用于指定主键生成策略,如IDENTITY、SEQUENCE、TABLE等。 5. **缓存机制**:Hibernate的二级缓存可以通过注解配置,例如@Cacheable和@Cache。 6. **复杂类型和集合**:@...

    hibernate-annotations-3.4.0.GA架包和slf4j-1.5.8架包

    3. **关系映射**:@OneToOne、@OneToMany、@ManyToOne、@ManyToMany注解分别用于一对一、一对多、多对一和多对多的关系映射,它们可以通过@JoinColumn或@JoinTable进行更详细的配置。 4. **继承策略**:@...

    Hibernate学习

    - 一对多:@ManyToOne和@OneToMany,一方通常设置@JoinColumn,另一方设置@ManyToOne。 - 多对多:@ManyToMany,通过中间表关联两个实体。 10. **性能优化** - 避免N+1查询:通过批处理或联合查询减少数据库访问...

    健身房会员管理设计文档

    - **实体间关系映射**:通过`@ManyToOne`、`@OneToOne`、`@OneToMany`等注解定义实体之间的关系,实现数据的一致性和完整性。 #### 六、总结 本项目通过对健身房后台管理系统的深入分析与设计,不仅实现了健身房...

    hibernate实体系注解

    在这个例子中,`Student`类中的`classInfo`字段用`@ManyToOne`注解,表示一个学生属于一个班级。`@JoinColumn`指定了外键字段`class_id`。 **四、级联操作和懒加载** 在处理一对多或多对一关系时,我们可能会遇到...

    Hibernate 注解映射

    * 双向一对多映射:在多端使用 @ManyToOne 和 @JoinColumn 注解,在一端使用 @OneToMany 和 mappedBy 注解,指定关联属性名。 * 双线一对一映射:基于外键使用 @OneToOne 注解,基于主键使用 Hibernate 的扩展注解。...

    Jpa的多对一的代码

    在JPA中,"多对一"关系可以通过在实体类中定义`@ManyToOne`注解来实现。让我们深入探讨这个概念。 首先,我们需要理解实体(Entity)的概念。在JPA中,实体是数据库表的映射,通常由一个带有`@Entity`注解的Java类...

    hibernate关系映射

    在`Student`类中,`@ManyToOne`注解表明`class`字段是一个多对一关系,`@JoinColumn`指定了外键所在的列名。 2. **配置表结构**: 在数据库中,`Student`表需要有一个外键字段`class_id`,指向`Class`表的`id`字段...

Global site tag (gtag.js) - Google Analytics