實(shí)體BEAN的關(guān)聯(lián)
一對(duì)多目前只看到了這么多,接下來(lái)要看一下多對(duì)多的情況.
今天自己寫(xiě)了一個(gè)例子,有關(guān)實(shí)體BEAN的關(guān)聯(lián)問(wèn)題,我寫(xiě)的這個(gè)例子是一對(duì)多的情況,一是人,多是狗,一個(gè)人可以養(yǎng)多條狗,每條狗都必須有一個(gè)主人,在刪除主人的時(shí)候,狗就沒(méi)有存在的必要了,所以狗也要跟著刪除,可是刪除狗的時(shí)候,主人卻可以在.一開(kāi)始我實(shí)現(xiàn)的時(shí)候,刪除狗的操作是錯(cuò)誤的,我以為直接把Person里面的Dog刪掉,然后更新Person就可以了,誰(shuí)知不是這樣的,你在增加了Person中的狗的時(shí)候,你更新Person就可以把狗加進(jìn)來(lái)了,可是當(dāng)你把Person里面的狗刪除掉時(shí),再更新Person,數(shù)據(jù)庫(kù)里面的狗卻不會(huì)少.而要你顯示的調(diào)用em.remove()去刪除你想刪除的狗,并且你對(duì)這狗不能設(shè)置為級(jí)聯(lián)刪除,否則你刪除狗的時(shí)候把人也刪掉了,這當(dāng)然不是我們希望看到的.
下面附上代碼
package com.hadeslee.session;
import com.hadeslee.entity.Person;
import java.util.List;
import javax.ejb.Remote;
/**
* This is the business interface for PersonDAO enterprise bean.
*/
@Remote
public interface PersonDAORemote {
public void insertPerson(Person p);
public List getAllPersons();
public Person findPerson(long id);
public void deletePerson(long id);
}
import com.hadeslee.entity.Person;
import java.util.List;
import javax.ejb.Remote;
/**
* This is the business interface for PersonDAO enterprise bean.
*/
@Remote
public interface PersonDAORemote {
public void insertPerson(Person p);
public List getAllPersons();
public Person findPerson(long id);
public void deletePerson(long id);
}
package com.hadeslee.session;
import com.hadeslee.entity.Dog;
import com.hadeslee.entity.Person;
import java.util.List;
import javax.ejb.Remote;
/**
* This is the business interface for PersonToDogs enterprise bean.
*/
@Remote
public interface PersonToDogsRemote extends PersonDAORemote{
public void addDog(Person p,Dog dog);
public Person removeDog(Person p,Dog dog);
public List getDogs(Person p);
public Person getOwner(Dog dog);
}
import com.hadeslee.entity.Dog;
import com.hadeslee.entity.Person;
import java.util.List;
import javax.ejb.Remote;
/**
* This is the business interface for PersonToDogs enterprise bean.
*/
@Remote
public interface PersonToDogsRemote extends PersonDAORemote{
public void addDog(Person p,Dog dog);
public Person removeDog(Person p,Dog dog);
public List getDogs(Person p);
public Person getOwner(Dog dog);
}
/*
* PersonDAOBean.java
*
* Created on 2006年12月13日, 下午3:53
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.hadeslee.session;
import com.hadeslee.entity.Person;
import java.util.List;
import javax.ejb.Stateful;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
/**
*
* @author lbf
*/
@Stateful
public class PersonDAOBean implements com.hadeslee.session.PersonDAORemote {
@PersistenceContext
protected EntityManager em;
/** Creates a new instance of PersonDAOBean */
public PersonDAOBean() {
}
public void insertPerson(Person p) {
em.persist(p);
System.out.println("保存成功");
}
public List getAllPersons() {
Query query=em.createQuery("select p from Person p order by p.id");
return query.getResultList();
}
public Person findPerson(long id) {
return em.find(Person.class,id);
}
public void deletePerson(long id){
em.remove(em.find(Person.class,id));
}
}
* PersonDAOBean.java
*
* Created on 2006年12月13日, 下午3:53
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.hadeslee.session;
import com.hadeslee.entity.Person;
import java.util.List;
import javax.ejb.Stateful;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
/**
*
* @author lbf
*/
@Stateful
public class PersonDAOBean implements com.hadeslee.session.PersonDAORemote {
@PersistenceContext
protected EntityManager em;
/** Creates a new instance of PersonDAOBean */
public PersonDAOBean() {
}
public void insertPerson(Person p) {
em.persist(p);
System.out.println("保存成功");
}
public List getAllPersons() {
Query query=em.createQuery("select p from Person p order by p.id");
return query.getResultList();
}
public Person findPerson(long id) {
return em.find(Person.class,id);
}
public void deletePerson(long id){
em.remove(em.find(Person.class,id));
}
}
1. /*
2. * PersonToDogsBean.java
3. *
4. * Created on 2006年12月13日, 下午4:50
5. *
6. * To change this template, choose Tools | Template Manager
7. * and open the template in the editor.
8. */
9.
10. package com.hadeslee.session;
11.
12. import com.hadeslee.entity.Dog;
13. import com.hadeslee.entity.Person;
14. import java.util.List;
15. import javax.ejb.Stateless;
16. import javax.persistence.Query;
17.
18. /**
19. *
20. * @author lbf
21. */
22. @Stateless
23. public class PersonToDogsBean extends PersonDAOBean implements com.hadeslee.session.PersonToDogsRemote {
24.
25. /** Creates a new instance of PersonToDogsBean */
26. public PersonToDogsBean() {
27. }
28.
29. public void addDog(Person p, Dog dog) {
30. p.addDog(dog);
31. em.merge(p);
32. }
33.
34. public Person removeDog(Person p, Dog dog) {
35. //em.remove(dog);
36. p.removeDog(dog);
37. System.out.println("此時(shí)P的大小是:"+p.getDogs().size());
38. em.merge(p);
39. return p;
40. }
41.
42. public List getDogs(Person p) {
43. return p.getDogs();
44. }
45.
46. public Person getOwner(Dog dog) {
47. Query query=em.createQuery("select p from Person p where p.id=?1");
48. query.setParameter(1,dog.getOwner().getId());
49. return (Person)query.getSingleResult();
50. }
51.
52. }
目前的代碼是不能正常刪除的,要正常刪除狗的話(huà),必須把em.remove() 那句話(huà)還原,然把再把em.merge()那句話(huà)注釋起來(lái)才行還有一個(gè)現(xiàn)象,那就是我在對(duì)遠(yuǎn)程對(duì)象進(jìn)行了操作以后,并不會(huì)反映到我的本地對(duì)象,比如我調(diào)用了刪除人里面的一條狗,在遠(yuǎn)程或者在數(shù)據(jù)庫(kù)里面確實(shí)是刪掉了,可是我在調(diào)用人的時(shí)候,里面還是有那么的狗,這樣就會(huì)產(chǎn)生不同步的現(xiàn)象,為了消除這種現(xiàn)象,我把接口寫(xiě)了一個(gè),改為進(jìn)行了刪除操作的時(shí)候,它會(huì)再次返回Person對(duì)象,這個(gè)時(shí)候就可以保證遠(yuǎn)程對(duì)象和本地對(duì)象的一致性了. 增加代碼沒(méi)寫(xiě),所以每次增加了狗后,調(diào)用Person對(duì)象時(shí),依然是增加前一樣的,也就是說(shuō),當(dāng)我持有了遠(yuǎn)程對(duì)象發(fā)過(guò)來(lái)的本地對(duì)象后,如果我不對(duì)其進(jìn)行操作,無(wú)論你怎么調(diào)用遠(yuǎn)程方法,此方法會(huì)對(duì)其有影響的,JVM都不會(huì)返回一個(gè)最新的給你,而你用的永遠(yuǎn)是第一次傳過(guò)來(lái)的那個(gè)以象,所以,在遠(yuǎn)程對(duì)象傳輸中,必須要注意同步性,要么就每次都從遠(yuǎn)程去取最新的對(duì)象,要么就先對(duì)本地對(duì)象做同樣的操作,比如前面的addDog動(dòng)作,先在本地執(zhí)行一遍,然后遠(yuǎn)程執(zhí)行遠(yuǎn)程的,這樣就可以同步了,不過(guò)我覺(jué)得如果是網(wǎng)絡(luò)允許的情況下,還是每次對(duì)對(duì)象操作后都能返回最新的對(duì)象好一些,免得手工去保持和遠(yuǎn)程對(duì)象的同步,這樣不可靠.2. * PersonToDogsBean.java
3. *
4. * Created on 2006年12月13日, 下午4:50
5. *
6. * To change this template, choose Tools | Template Manager
7. * and open the template in the editor.
8. */
9.
10. package com.hadeslee.session;
11.
12. import com.hadeslee.entity.Dog;
13. import com.hadeslee.entity.Person;
14. import java.util.List;
15. import javax.ejb.Stateless;
16. import javax.persistence.Query;
17.
18. /**
19. *
20. * @author lbf
21. */
22. @Stateless
23. public class PersonToDogsBean extends PersonDAOBean implements com.hadeslee.session.PersonToDogsRemote {
24.
25. /** Creates a new instance of PersonToDogsBean */
26. public PersonToDogsBean() {
27. }
28.
29. public void addDog(Person p, Dog dog) {
30. p.addDog(dog);
31. em.merge(p);
32. }
33.
34. public Person removeDog(Person p, Dog dog) {
35. //em.remove(dog);
36. p.removeDog(dog);
37. System.out.println("此時(shí)P的大小是:"+p.getDogs().size());
38. em.merge(p);
39. return p;
40. }
41.
42. public List getDogs(Person p) {
43. return p.getDogs();
44. }
45.
46. public Person getOwner(Dog dog) {
47. Query query=em.createQuery("select p from Person p where p.id=?1");
48. query.setParameter(1,dog.getOwner().getId());
49. return (Person)query.getSingleResult();
50. }
51.
52. }
一對(duì)多目前只看到了這么多,接下來(lái)要看一下多對(duì)多的情況.