轉載:@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"));
}