Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate работа с @ManyToOne / 6 сообщений из 6, страница 1 из 1
10.09.2015, 15:40
    #39048236
KTOIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate работа с @ManyToOne
Есть сущности:

Код: 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.
import javax.persistence.*;
import java.io.Serializable;
import java.util.Set;
 
import static javax.persistence.GenerationType.IDENTITY;
 
@Entity
public class Query implements Serializable{
    private int id;
    private String name;
    private String settings;
    private boolean blocked;
    private boolean deleted;
    private User user;
 
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id")
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    @Column(name = "name")
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Column(name = "settings")
    public String getSettings() {
        return settings;
    }
 
    public void setSettings(String settings) {
        this.settings = settings;
    }
 
    @Column(name = "is_blocked")
    public boolean isBlocked() {
        return blocked;
    }
 
    public void setBlocked(boolean blocked) {
        this.blocked = blocked;
    }
 
    @Column(name = "is_deleted")
    public boolean isDeleted() {
        return deleted;
    }
 
    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }
 
    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "owner_id")
    public User getUser() {
        return user;
    }
 
    public void setUser(User user) {
        this.user = user;
    }
}




Код: 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.
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import ru.nahodka.bi.hibernate.JSONUserType;
 
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
 
import static javax.persistence.GenerationType.IDENTITY;
 
 
@Entity
@Table(name = "_user")
public class User implements Serializable {
    private int id;
    private String login;
    private String passwordHash;
    private String passwordSalt;
    private String name;
    private String family;
    private String patronymic;
    private boolean deleted;
 
    private Set<Query> queries;
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id")
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    @Column(name = "login")
    public String getLogin() {
        return login;
    }
 
    public void setLogin(String login) {
        this.login = login;
    }
 
    @Column(name = "password_hash")
    public String getPasswordHash() {
        return passwordHash;
    }
 
    public void setPasswordHash(String passwordHash) {
        this.passwordHash = passwordHash;
    }
 
    @Column(name = "password_salt")
    public String getPasswordSalt() {
        return passwordSalt;
    }
 
    public void setPasswordSalt(String passwordSalt) {
        this.passwordSalt = passwordSalt;
    }
 
    @Column(name = "name")
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Column(name = "family")
    public String getFamily() {
        return family;
    }
 
    public void setFamily(String family) {
        this.family = family;
    }
 
    @Column(name = "patronymic")
    public String getPatronymic() {
        return patronymic;
    }
 
    public void setPatronymic(String patronymic) {
        this.patronymic = patronymic;
    }
 
    @Column(name = "is_deleted")
    public boolean isDeleted() {
        return deleted;
    }
 
    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }
 
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval=true)
    public Set<Query> getQueries() {
        return queries;
    }
 
    public void setQueries(Set<Query> queries) {
        this.queries = queries;
    }
}



при удалении объекта Query получаю ошибку:

org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [...User#15]
если поменять у Query:
cascade = {CascadeType.ALL} на что то другое, что при сохранении Query получаю ошибку:
org.postgresql.util.PSQLException: ERROR: null value in column "owner_id" violates not-null constraint

Сохранение:
Код: java
1.
sessionFactory.getCurrentSession().save(query);


Удаление:
Код: java
1.
sessionFactory.getCurrentSession().delete(query);



Как решить данную ситуацию?
...
Рейтинг: 0 / 0
10.09.2015, 17:27
    #39048359
xifr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate работа с @ManyToOne
KTOIA,

Если вы делаете в одной сессии save и delete
то или перезагружай объект перед удалением, или вместо save делай persist.
...
Рейтинг: 0 / 0
11.09.2015, 10:35
    #39048797
KTOIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate работа с @ManyToOne
xifr,
нет, я делаю это в разных сессиях
...
Рейтинг: 0 / 0
11.09.2015, 11:52
    #39048955
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate работа с @ManyToOne
KTOIAxifr,
нет, я делаю это в разных сессиях
в разных что? Один и тот же объект?
Возьмите демку по вашему маппингу с примером кода.
Hello World ManyToOne
...
Рейтинг: 0 / 0
14.09.2015, 13:09
    #39050775
KTOIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate работа с @ManyToOne
Petro123в разных что? Один и тот же объект?

один и тот же объект в разных сессиях, каждое действие, удаление, создание, происходит в отдельном @test

Petro123Возьмите демку по вашему маппингу с примером кода.
Hello World ManyToOne


так и сделал, я взял исходники от учебника со Spring, там отдельная глава для hibernate, та же самая проблема

вот что я понял: если я хочу создать объект Query, то необходимо взять объект User и добавить к нему новый объект Query и обновить User. Если попытаться создать Query, то в поле User при insert в Sql не проставляется user_id, хотя в объекте Query был указан User, это все происходит если у Query:
Код: java
1.
2.
3.
4.
5.
    @ManyToOne
    @JoinColumn(name = "owner_id")
    public User getUser() {
        return user;
    }



если к нему добавить
Код: java
1.
@ManyToOne(cascade = {CascadeType.ALL})

, то при удалении будет ошибка:
Код: java
1.
org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [...User#15]



и мне интересно, есть ли решение, при котором можно создавать Query, указав существующий User и не получить проблему с удалением Query
...
Рейтинг: 0 / 0
14.09.2015, 13:29
    #39050793
KTOIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate работа с @ManyToOne
разобрался, выше написано много бреда :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate работа с @ManyToOne / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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