Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA OneToMany / 25 сообщений из 33, страница 1 из 2
31.05.2012, 15:57:16
    #37819878
denis11111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Добрий день.
Есть два Entity класа:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
@Entity
@Table(name = "books")
public class Books implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
   @Column(name = "bookname")
    private String bookname;
    @OneToMany(mappedBy = "bookId")
    private List<Users> usersList;

    public Books() {
    }

    public Books(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBookname() {
        return bookname;
    }

    public void setBookname(String bookname) {
        this.bookname = bookname;
    }

    @XmlTransient
    public List<Users> getUsersList() {
        return usersList;
    }

    public void setUsersList(List<Users> usersList) {
        this.usersList = usersList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Books)) {
            return false;
        }
        Books other = (Books) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "core.Books[ id=" + id + " ]";
    }
    
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
@Entity
@Table(name = "users")
public class Users implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    @Column(name = "username")
    private String username;
    @JoinColumn(name = "book_id", referencedColumnName = "id")
    @ManyToOne
    private Books bookId;

    public Users() {
    }

    public Users(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Books getBookId() {
        return bookId;
    }

    public void setBookId(Books bookId) {
        this.bookId = bookId;
    }

   
    
}




Так вот, если я хочу вибрать всех Users по Books, то мне достаточно звернутся к списку usersList?
Тобто JPA заносит всех Users в usersList автоматически или надо писать какие-то ищо методы?

В меня что-то в usersList заносятся не все Users, а иногда после перезапуска проекта все занесутся...
...
Рейтинг: 0 / 0
31.05.2012, 16:42:04
    #37819989
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
denis11111В меня что-то в usersList заносятся не все Users, а иногда после перезапуска проекта все занесутся...
в таких случаях пишут - Ошибка в 17 строке, т.к. кто кроме тебя разберётся в "что-то" и "иногда".
Дебажь и тестируй
...
Рейтинг: 0 / 0
31.05.2012, 17:13:28
    #37820083
denis11111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Вот зделал я выборку всех записей из таблицы Books. В меня создался список обьектов Books. Вы знаете что каждый обьект это своего рода отдельная строка в таблице.

Как вы видете в коде выше, в Entity-класе Books есть "List<Users> usersList", который должен бы хранить список обьектов Users, которые привязаны к текущему обьекту Books.

Вот usersList меня и интересует, он сам заполняется или нет
...
Рейтинг: 0 / 0
31.05.2012, 17:37:58
    #37820159
Vladmir K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
denis11111Вот usersList меня и интересует, он сам заполняется или нет
сами, во время вызова
Код: java
1.
aBook.getUsersList()


при условии, что aBook находится в контексте (PersistenceContext).

Другой вопрос, что если в список (полученный aBook.getUsersList()) добавить нового юзера, то новый не сохранится.
...
Рейтинг: 0 / 0
31.05.2012, 17:55:43
    #37820210
denis11111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
А что надо делать чтоб userList оновлялся?
...
Рейтинг: 0 / 0
31.05.2012, 18:28:44
    #37820284
Vladmir K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
denis11111А что надо делать чтоб userList оновлялся?
создать объект aUsers, setBook(abook) (кстати, в твоем случае bookId, что не красиво), em.pesist(aUsers).Где em - EntityManager

или

настроить каскад (см cascade, CascadeType) со стороны Book и сохранять как em.merger(aBook). Но здесь свои тараканы....
...
Рейтинг: 0 / 0
31.05.2012, 18:59:47
    #37820319
denis11111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Entyty-Books
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
@Entity
@Table(name = "books")
public class Books implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    @Column(name = "bookname")
    private String bookname;
    @OneToMany(mappedBy = "bookId")
    private List<Users> usersList;

    public Books() {
    }

    public Books(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBookname() {
        return bookname;
    }

    public void setBookname(String bookname) {
        this.bookname = bookname;
    }

    @XmlTransient
    public List<Users> getUsersList() {
        return usersList;
    }

    public void setUsersList(List<Users> usersList) {
        this.usersList = usersList;
    }




Entyty-Users
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
@Entity
@Table(name = "users")
public class Users implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    @Column(name = "username")
    private String username;
    @JoinColumn(name = "book_id", referencedColumnName = "id")
    @ManyToOne
    private Books bookId;

    public Users() {
    }

    public Users(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Books getBookId() {
        return bookId;
    }

    public void setBookId(Books bookId) {
        this.bookId = bookId;
    }
    
}



Абстрактной клас модели
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public abstract class AbstractFacade<T> {
    private Class<T> entityClass;

    public AbstractFacade(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    protected abstract EntityManager getEntityManager();

    public void create(T entity) {
        getEntityManager().persist(entity);
    }

    public void edit(T entity) {
        getEntityManager().merge(entity);
    }

    public void remove(T entity) {
        getEntityManager().remove(getEntityManager().merge(entity));
    }

    public T find(Object id) {
        return getEntityManager().find(entityClass, id);
    }

    public List<T> findAll() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return getEntityManager().createQuery(cq).getResultList();
    }
  
}



Сами модели:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Stateless
public class BooksFacade extends AbstractFacade<Books> {
    @PersistenceContext(unitName = "TestEJBPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public BooksFacade() {
        super(Books.class);
    }
    
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Stateless
public class UsersFacade extends AbstractFacade<Users> {
    @PersistenceContext(unitName = "TestEJBPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public UsersFacade() {
        super(Users.class);
    }
    
}



Так вот, теперь создаем контрелер:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
@ManagedBean(name = "MainController")
@SessionScoped
public class MainController implements Serializable {

@EJB
private core.BooksFacade bookModel;
@EJB
private core.UsersFacade userModel;

@PostConstruct
public void test(){

List<Books> res = bookModel.findAll();
Log.print(res.get(0).getUsersList().size()) // Припустим есть 2 елемента в списке, то есть на одну книгу два пользивателя

Users user = new Users();

user.setUsername("df");
user.setBookId(res.get(0));

userModel.create(user) // Создаем а потом додем нового пользывателя в таблицу Users


res = bookModel.findAll(); 
Log.print(res.get(0).getUsersList().size()) // Должно бить теперь 3 елемента в списка, а их только 2 WTF?!!

}
...
Рейтинг: 0 / 0
01.06.2012, 10:00:40
    #37820936
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
denis11111,

200 строк кода для 2-полей ! Код + Имя.
А ведь в обычной ИС по 500 классов с 15-20-50 полями.
ЗЫ. Так, мысли вслух.
...
Рейтинг: 0 / 0
01.06.2012, 10:13:26
    #37820959
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
...
Рейтинг: 0 / 0
01.06.2012, 10:38:56
    #37821008
Vladmir K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Petro123denis11111,
http://www.sql.ru/forum/actualthread.aspx?tid=927509&pg=2&mid=12282254&hl=book%20b%20new%20book#12282254

Petro123 прав, тут все дело в LazyInitialization

Проблема в том, что при создании нового пользователя, он отлично записывается в базу. Но он не "уведомляет" aBook, кот. уже в контексте (и возможно уже закеширована), что у нее появился новый юзер.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
        Book aBook = em.find(Book.class, 1L);

        System.out.println(aBook.getTitle() + " user count: " +
                           aBook.getUsers().size());

        User u = new User();
        u.setBook(aBook);

        javax.persistence.EntityTransaction tx = em.getTransaction();

        try {
            tx.begin();
            em.persist(u);
            //em.refresh(aBook);
            System.out.println("After saving: " + aBook.getUsers().size());
            tx.commit();
        } catch (Exception ex) {
            ex.printStackTrace();

        } finally {
            em.close();
        }



Результат:
Hibernate: select book0_.id as id3_1_, book0_.title as title3_1_, users1_.book_id as book2_3_3_, users1_.id as id3_, users1_.id as id4_0_, users1_.book_id as book2_4_0_ from book book0_ left outer join users users1_ on book0_.id=users1_.book_id where book0_.id=?
book1 user count: 11
Hibernate: insert into users (book_id) values (?)
After saving: 11

Должно быть 12. em.refresh(aBook), конечно, решит проблему. But it's odd!
...
Рейтинг: 0 / 0
04.06.2012, 15:51:07
    #37824473
Vladmir K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Время шло, а в голове все витает мысль: а почему u (User) ничего не говорит aBook, что он изменился. Слишком трудозатратно?
И дело ведь тут не LazyInitialization, IMHO... Если уйти от коллекции, то результат останется тот же.
...
Рейтинг: 0 / 0
04.06.2012, 16:22:27
    #37824547
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Поставь
Код: java
1.
fetch=FetchType.LAZY


И тогда ты при загрузке данных с базы будешь получать не пустой список.
Но это плохой тон, загружать сразу все данные из базы. Лучше при загрузке обращайся в ручную к списку, только при необходимости, например
Код: java
1.
resultList.getUsersList().size()
...
Рейтинг: 0 / 0
04.06.2012, 16:28:40
    #37824563
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Вот у меня похожая ситуация, только другая проблема)

Код: java
1.
2.
@OneToMany(mappedBy = "region")
	private List<City> cities;



Код: java
1.
2.
3.
4.
@ManyToOne(optional=false)
	@JoinColumn(name="CITY_REG_ID")
   	@NotNull
	private Region region;



Код: java
1.
2.
3.
4.
   //Новый список городов
        List<City> listOfPickCities= cits.getTarget();
       this.region.setCities(listOfPickCities);
       em.merge(this.region);




В итоге обновления нет, в чем проблема у меня?
...
Рейтинг: 0 / 0
04.06.2012, 17:11:08
    #37824671
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
krab,
ну дак, приведи полный код примера-теста.
...
Рейтинг: 0 / 0
04.06.2012, 17:22:33
    #37824702
Vladmir K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Petro123krab,
ну дак, приведи полный код примера-теста.

Каскад указать, наверное забыл:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    @OneToMany(mappedBy = "book"
               cascade = CascadeType.MERGE)

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

            User u = new User();
            aBook.getUsers().add(u);
            u.setBook(aBook);
            aBook = em.merge(aBook);
...
Рейтинг: 0 / 0
04.06.2012, 17:25:00
    #37824707
Vladmir K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
krabПоставь
Код: java
1.
fetch=FetchType.LAZY


Неее, не в этом дело... ты не понял. Мне "не нравится" не ленивая инициализация (кстати, для коллекция по умолчанию она всегда ленивая), а то что EntityManager мог бы быть порасторопнее.
...
Рейтинг: 0 / 0
04.06.2012, 17:31:44
    #37824721
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Petro123,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
package com.kmware.ttk.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;

import org.primefaces.component.datatable.DataTable;
import org.primefaces.model.DualListModel;

import com.kmware.ttk.model.City;
import com.kmware.ttk.model.CityService;
import com.kmware.ttk.model.Region;
import com.kmware.ttk.model.RegionsDataModel;
import com.kmware.ttk.service.CitiesService;
import com.kmware.ttk.service.RegionService;

@SessionScoped
@Named("regionBean")
public class RegionManager implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4399462461820100316L;

	@Inject
	private EntityManager em;

	@EJB
	private RegionService regionService;
	@EJB 
	private CitiesService cityService;

	private Region region;
	private DataTable dataTable;
	private transient DataModel<Region> model;
	private transient Region[] selectionModel;
	
	private DualListModel<City> cits;
	private List<City> sourceCities;
	private List<City> targetCities;



	public RegionManager() {

	}

	@PostConstruct
	public void init() {
		region = new Region();
		sourceCities = cityService.getResultList();
		targetCities= new ArrayList<City>();
		cits = new DualListModel<City>(sourceCities, targetCities);
		if (model == null) {
			model = new RegionsDataModel(this.getAllRegions());
		}
		
		if(selectionModel == null){
			selectionModel = new Region[0];
		}
		
	}
	
	private boolean isDateValid() {
		 if((this.region.getCreationDate()!=null)&&(this.region.getRegCloseDate()!=null)){
		    return this.region.getCreationDate().getTime()<=this.region.getRegCloseDate().getTime();
		 }
		 else return true;
		  }

	/**
	 * A list of all regions in the database
	 * 
	 * @return Region entities in database
	 */
	public List<Region> getAllRegions() {
		return regionService.getResultList();
	}
	
	
	

	public List<Region> getRegionsById(Long[] ids) {
		if (ids != null && ids.length > 0) {
			return em
					.createQuery(
							"select region FROM Region AS region WHERE region.regId in (:idList) order by region.regName",
							Region.class)
					.setParameter("idList", Arrays.asList(ids)).getResultList();
		} else {
			return Arrays.asList(new Region[] {});
		}
	}
	
	

	/**
	 * Find region by region id
	 * 
	 * @param id
	 *            of the region
	 * @return Region entity
	 */
	public Region getRegionById(Long id) {
		Region r = em
				.createQuery(
						"SELECT region FROM Region AS region WHERE region.regId=:id",
						Region.class).setParameter("id", id).getSingleResult();
		r.getCities().size();
		return r;
	}

	@SuppressWarnings("unchecked")
	public List<Region> getRegionsIdAndName() {
		return em
				.createQuery(
						"select region.regId as id, region.regName as name from Region region ORDER BY region.regName")
				.getResultList();
	}
	
	/* Navigation actions */
	
	/**
	 * Save new region in DB and redirect to region list
	 * @return - outcome "regionlist"
	 */
	public String newRegion() {
		if(isDateValid()){
			em.persist(this.region);
			for(City city: cits.getTarget()){
				this.region.getCities().add(city);
				city.setRegion(this.region);
				em.merge(region);
				em.persist(city);
			}
			em.merge(region);
		model = new RegionsDataModel(this.getAllRegions());
		em.refresh(region);
		this.region.getCities().size();
		return "viewRegion";
		}
		else{
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR,"Дата закрытия меньше даты создания", "Дата закрытия меньше даты создания"));
			return null;
		}
	}
	
	/**
	 * Update region in DB and redirect to region card
	 * @return - outcome "viewRegion"
	 */
	public String updateRegion() {
		if(isDateValid()){
			
			List<City> listOfPickCities= cits.getTarget();
			
				this.region.setCities(listOfPickCities);
				em.merge(this.region);
				model = new RegionsDataModel(this.getAllRegions());
                                em.refresh(region);
				
		return "viewRegion";
		}
		else{
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR,"Дата закрытия меньше даты создания", "Дата закрытия меньше даты создания"));
			return null;
		}
	}
	
	
	/**
	 * Navigation rule for plrimefaces row selection
	 */
	public void onRowSelected(){
		FacesContext fc = FacesContext.getCurrentInstance();
		ConfigurableNavigationHandler o = (ConfigurableNavigationHandler) fc
				.getApplication().getNavigationHandler();
		o.performNavigation(this.viewRegion());
	}
	
	/**
	 * Perform actions for viewing the region info
	 * @return - outcome "viewRegion"
	 */
	public String viewRegion() {
		setRegion(this.getRegionById(this.region.getRegId()));
		targetCities.clear();
		for(City city:this.region.getCities()){
			targetCities.add(city);
		}
		cits.setTarget(targetCities);

		return "viewRegion";
	}
	
	/**
	 * Perform actions for editing the region info
	 * @return - outcome "editRegion"
	 */
	public String editRegion() {
        sourceCities= cityService.getResultList();
		sourceCities.removeAll(cits.getTarget());
		cits.setSource(sourceCities);
		return "editRegion";
	}
	
	/**
	 * Perform actions for adding the region info
	 * @return - outcome "addRegion"
	 */
	public String addRegion() {
		sourceCities= cityService.getResultList();
		cits.setSource(sourceCities);
		targetCities.clear();
		cits.setTarget(targetCities);
		this.region = new Region();
		return "addRegion";
	}
	
	/**
	 * Perform actions for deleting the region. Redirecting to list
	 * @return - outcome "regionList"
	 */
	public String deleteRegion() {
//		this.regionService.sync(this.region);
		this.regionService.remove(this.region);
		return this.regionList();
	}
	
	/**
	 * Perform actions for region list view.
	 * @return - outcome "regionList"
	 */
	public String regionList() {
		this.region = new Region();
		return "regionList";
	}

	public Region getRegion() {
		return region;
	}

	public void setRegion(Region region) {
		this.region = region;
	}

	public DataTable getDataTable() {
		return dataTable;
	}

	public void setDataTable(DataTable dataTable) {
		this.dataTable = dataTable;
	}

	public DataModel<Region> getModel() {
		return model;
	}

	public void setModel(DataModel<Region> model) {
		this.model = model;
	}
	
	public Region[] getSelectionModel() {
		return selectionModel;
	}
	
	public void setSelectionModel(Region[] selectionModel) {
		this.selectionModel = selectionModel;
	}
	
	public DualListModel<City> getCits() {
		return cits;
	}

	public void setCits(DualListModel<City> cits) {
		this.cits = cits;
	}

	public List<City> getSourceCities() {
		return sourceCities;
	}

	public void setSourceCities(List<City> sourceCities) {
		this.sourceCities = sourceCities;
	}

	public List<City> getTargetCities() {
		return targetCities;
	}

	public void setTargetCities(List<City> targetCities) {
		this.targetCities = targetCities;
	}
}
...
Рейтинг: 0 / 0
04.06.2012, 17:34:55
    #37824731
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Метод добавления работает нормально.
Метод обновления не обновляет список городов
...
Рейтинг: 0 / 0
04.06.2012, 17:40:10
    #37824747
Vladmir K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
krab,

merge() возвращает новый объект.

Код: java
1.
region = em.merge(region)
...
Рейтинг: 0 / 0
04.06.2012, 17:44:26
    #37824754
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Vladmir K,
Т.е. мне нужно сделать
Код: java
1.
setRegion(em.merge(this.region));

?

И вообще если метод возвращает новый объект, то почему я вижу только одни селекты из базы?
...
Рейтинг: 0 / 0
04.06.2012, 17:59:18
    #37824780
Vladmir K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
krabVladmir K,
Т.е. мне нужно сделать
Код: java
1.
setRegion(em.merge(this.region));


?
Если честно, то я уже потерялся.
Проблемный метод public String updateRegion()?
Мне кажется что проблема с отображением. На уровне базы отрабатываться должно.

И вообще если метод возвращает новый объект, то почему я вижу только одни селекты из базы?
после
Код: java
1.
2.
3.
4.
List<City> listOfPickCities= cits.getTarget();
			
				this.region.setCities(listOfPickCities);
				em.merge(this.region);


insert должен пройти.
...
Рейтинг: 0 / 0
04.06.2012, 18:09:01
    #37824799
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Vladmir K,

Да, проблемный метод updateRegion

А вот инсертов в базе нет, и проблема именно в этом. Не пойму почему так происходит...
...
Рейтинг: 0 / 0
04.06.2012, 18:16:05
    #37824816
Vladmir K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
krab,

cascade = CascadeType.MERGE

есть на Region?
...
Рейтинг: 0 / 0
04.06.2012, 18:25:06
    #37824827
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
Vladmir K,

Код: java
1.
2.
@OneToMany(mappedBy = "region", cascade = {CascadeType.MERGE})
	private List<City> cities;



Так тоже инсерта не наблюдаю
...
Рейтинг: 0 / 0
05.06.2012, 07:49:44
    #37825210
Vladmir K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA OneToMany
krab,
Код: java
1.
2.
this.region.setCities(listOfPickCities);
em.merge(this.region);


Если дебаг показывает, что listOfPickCities и region изменились, а нет инсерта, то давай лог в студию.
(<property name="hibernate.show_sql" value="true"/>)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA OneToMany / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]