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

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章