Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hiberante ManyToMany через OneToMany и ManyToOne? 
:(
    Опции темы
unkis
  Дата 29.5.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Пытаюсь запустить этот пример>>>>здесь<<<<

Добавил ещё конструкторы и get-setMethods.

дальше делаю так.
Код


User u = new User();
        u.setUsername("a");
        u.setPassword("a");
        
        Role r = new Role();
        r.setName("b");
        
        UserRole ur = new UserRole(u,r,true);
        
        entityManager.save(u);
        entityManager.save(r);        
        entityManager.save(ur);


в итоге сохраняется всё кроме таблицы UserRole, почему так происходит, и как мне сохранит UserRole ? 

и второе, это всё происходит без транзакции, а вот как только я хочу сделать это всё через транзакцию то выскакивает ошибка.
Код

emf2 = Persistence.createEntityManagerFactory("hacon_w");
        entityManager = (Session) emf2.createEntityManager().getDelegate();
        tx2 = entityManager.getTransaction();
        tx2.begin();
        
        User u = new User();
        u.setUsername("a");
        u.setPassword("a");
        
        Role r = new Role();
        r.setName("b");
        
        UserRole ur = new UserRole(u,r,true);
        
        entityManager.save(u);
        entityManager.save(r);        
        entityManager.save(ur);
        
        tx2.commit();
        entityManager.close();


Код

17:45:03,388 DEBUG AbstractFlushingEventListener:154 - dirty checking collections
17:45:03,388 DEBUG AbstractFlushingEventListener:171 - Flushing entities and processing referenced collections
17:45:03,390 DEBUG AbstractFlushingEventListener:210 - Processing unreferenced collections
17:45:03,390 DEBUG AbstractFlushingEventListener:224 - Scheduling collection removes/(re)creates/updates
17:45:03,390 DEBUG AbstractFlushingEventListener:85 - Flushed: 1 insertions, 0 updates, 0 deletions to 3 objects
17:45:03,390 DEBUG AbstractFlushingEventListener:91 - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
17:45:03,391 DEBUG Printer:83 - listing entities:
17:45:03,391 DEBUG Printer:90 - de.hacon.warehouse.Role{id=1, userRoles=null, name=b}
17:45:03,391 DEBUG Printer:90 - de.hacon.warehouse.User{id=1, username=a, userRoles=null, password=a}
17:45:03,391 DEBUG Printer:90 - de.hacon.warehouse.UserRole{enabled=true, role=de.hacon.warehouse.Role#1, user=de.hacon.warehouse.User#1}
17:45:03,391 DEBUG AbstractFlushingEventListener:290 - executing flush
17:45:03,392 DEBUG ConnectionManager:467 - registering flush begin
17:45:03,392 DEBUG AbstractEntityPersister:2200 - Inserting entity: [de.hacon.warehouse.UserRole#component[userId,roleId]{userId=null, roleId=null}]
17:45:03,395 DEBUG AbstractBatcher:358 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
17:45:03,395 DEBUG SQL:393 - insert into USER_ROLE (USER_ID, ROLE_ID, ENABLED, userId, roleId) values (?, ?, ?, ?, ?)
Hibernate: insert into USER_ROLE (USER_ID, ROLE_ID, ENABLED, userId, roleId) values (?, ?, ?, ?, ?)
17:45:03,395 DEBUG AbstractBatcher:476 - preparing statement
17:45:03,396 DEBUG AbstractEntityPersister:1988 - Dehydrating entity: [de.hacon.warehouse.UserRole#component[userId,roleId]{userId=null, roleId=null}]
17:45:03,397 DEBUG AbstractBatcher:44 - Executing batch size: 1
17:45:03,398 DEBUG AbstractBatcher:366 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
17:45:03,398 DEBUG AbstractBatcher:525 - closing statement
17:45:03,399 DEBUG JDBCExceptionReporter:69 - Could not execute JDBC batch update [insert into USER_ROLE (USER_ID, ROLE_ID, ENABLED, userId, roleId) values (?, ?, ?, ?, ?)]
java.sql.BatchUpdateException: Column 'userId' cannot be null
    at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:665)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at de.hacon.contoller.Controller.proba(Controller.java:584)
    at de.hacon.main.ParserStart.main(ParserStart.java:23)
17:45:03,400  WARN JDBCExceptionReporter:77 - SQL Error: 1048, SQLState: 23000
17:45:03,400 ERROR JDBCExceptionReporter:78 - Column 'userId' cannot be null
17:45:03,400 ERROR AbstractFlushingEventListener:301 - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:249)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at de.hacon.contoller.Controller.proba(Controller.java:584)
    at de.hacon.main.ParserStart.main(ParserStart.java:23)
Caused by: java.sql.BatchUpdateException: Column 'userId' cannot be null
    at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:665)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
    ... 9 more
Exception in thread "main" 17:45:03,402 DEBUG ConnectionManager:476 - registering flush end
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:249)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at de.hacon.contoller.Controller.proba(Controller.java:584)
    at de.hacon.main.ParserStart.main(ParserStart.java:23)
Caused by: java.sql.BatchUpdateException: Column 'userId' cannot be null
    at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:665)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
    ... 9 more



Ребята помогите пожалуйста, очень надо.



--------------------
www.unkis.com
PM MAIL WWW   Вверх
unkis
Дата 30.5.2007, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



ну что так никто и не поможет, никто, не сталкивался с такой проблемой?


--------------------
www.unkis.com
PM MAIL WWW   Вверх
tux
Дата 30.5.2007, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(unkis @  30.5.2007,  09:34 Найти цитируемый пост)
ну что так никто и не поможет, никто, не сталкивался с такой проблемой? 

Проблема здесь:
Код

@GeneratedValue(strategy=GenerationType.IDENTITY)

Надо задать генератор первичных ключей, который будет работать с твоей СУБД. 
PM MAIL Skype GTalk Jabber YIM   Вверх
unkis
Дата 30.5.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



так стоит в Role и User генератор первичных ключей.

Код

@Entity
@Table(name="USER")
public class User {

  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private Long id;

  @Column(name="USERNAME")
  private String username;

  @Column(name="PASSWORD")
  private String password;

  @OneToMany(mappedBy="user")
  private Set<UserRole> userRoles;

}


Код

@Table(name="ROLE")
@Entity
public class Role {

  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private Long id;

  @Column(name="NAME")
  private String name;

  @OneToMany(mappedBy="role")
  private Set<UserRole> userRoles;
}


вот только не стоит Serializable нигде, но помоему так и долгно бить



--------------------
www.unkis.com
PM MAIL WWW   Вверх
tux
Дата 30.5.2007, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



А в твоей СУБД точно есть возможность задавать identity-поля? То, что никаких значений не задается говорит о том, что нифига. Какая СУБД-то?
PM MAIL Skype GTalk Jabber YIM   Вверх
unkis
  Дата 30.5.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Цитата(tux @  30.5.2007,  11:44 Найти цитируемый пост)
Какая СУБД-то?

MySQL 5 



Цитата(tux @  30.5.2007,  11:44 Найти цитируемый пост)
А в твоей СУБД точно есть возможность задавать identity-поля?

да, так как для других отношений 1:n все впоряадке.


Я никак немогу понять, ниукого нет уже готового решения? ведь ето проблема очень распрастраненная.

Ест таблица User<-------------> UserRole<------>Role  только в таблицу UserRole помимо ForigenKey(User и Role) добавленно еше пару колонок.

Как вообше решаетсыа такя проблема в хибернате, ето же вроде самий простой пример или?

Это сообщение отредактировал(а) unkis - 30.5.2007, 14:00


--------------------
www.unkis.com
PM MAIL WWW   Вверх
tux
Дата 30.5.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



А значения в UserRolePK у тебя где-нибудь устанавливаются? Вообще в UserRole первичный ключ задается?
PM MAIL Skype GTalk Jabber YIM   Вверх
unkis
Дата 30.5.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Цитата(tux @  30.5.2007,  12:59 Найти цитируемый пост)
А значения в UserRolePK у тебя где-нибудь устанавливаются? Вообще в UserRole первичный ключ задается? 


Нет, ничего у меня не устанавливается, а где и как это надо делать?

Вообщем вот так выглядят мои классы:

Код

package de.hacon.warehouse;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Table(name = "ROLE")
@Entity
public class Role implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "NAME")
    private String name;

    @OneToMany(mappedBy = "role")
    private Set<UserRole> userRoles = new HashSet<UserRole>();;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<UserRole> getUserRoles() {
        return userRoles;
    }

    public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }

    public Role() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Role(String name, Set<UserRole> userRoles) {
        super();
        this.name = name;
        this.userRoles = userRoles;
    }

}



Код

package de.hacon.warehouse;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "USER")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "USERNAME")
    private String username;

    @Column(name = "PASSWORD")
    private String password;

    @OneToMany(mappedBy = "user")
    private Set<UserRole> userRoles1 = new HashSet<UserRole>();

    public User(String username, String password, Set<UserRole> userRoles) {
        super();
        this.username = username;
        this.password = password;
        this.userRoles1 = userRoles;
    }

    public User() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Long getId() {
        return id;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

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

    public Set<UserRole> getUserRoles1() {
        return userRoles1;
    }

    public void setUserRoles1(Set<UserRole> userRoles) {
        this.userRoles1 = userRoles;
    }

}



Код

package de.hacon.warehouse;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="USER_ROLE")
@IdClass(UserRolePK.class)
public class UserRole {

  @Id
  @Column(name="USER_ID",insertable=false,
                         updatable=false)
  private Long userId;

  @Id
  @Column(name="ROLE_ID",insertable=false,
                         updatable=false)
  private Long roleId;

  @ManyToOne(cascade = CascadeType.ALL)
  @JoinColumn(name="USER_ID")
  private User user;

  @ManyToOne(cascade = CascadeType.ALL)
  @JoinColumn(name="ROLE_ID")
  private Role role;

  @Column(name="ENABLED")
  private boolean enabled;

public UserRole() {
    super();
    // TODO Auto-generated constructor stub
}

public UserRole(User user, Role role, boolean enabled) {
    super();
    this.user = user;
    this.role = role;
    this.enabled = enabled;
    
    
}

public boolean isEnabled() {
    return enabled;
}

public void setEnabled(boolean enabled) {
    this.enabled = enabled;
}

public Role getRole() {
    return role;
}

public void setRole(Role role) {
    this.role = role;
}

public Long getRoleId() {
    return roleId;
}

public void setRoleId(Long roleId) {
    this.roleId = roleId;
}

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

public Long getUserId() {
    return userId;
}

public void setUserId(Long userId) {
    this.userId = userId;
}  
}


Код

package de.hacon.warehouse;

import java.io.Serializable;

public class UserRolePK implements Serializable {

    private Long userId;

    private Long roleId;
}



и вот так я сохраняю
Код

User u = new User();
        u.setUsername("a");
        u.setPassword("a");
        
        Role r = new Role();
        r.setName("b");
        
        UserRole ur = new UserRole(u,r,true);
        tx2.begin();
        entityManager.persist(ur);
        tx2.commit();
        entityManager.close();
        System.out.println("Done.");




--------------------
www.unkis.com
PM MAIL WWW   Вверх
tux
Дата 30.5.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Я вообще плохо понимаю твой маппинг. Хотя может быть в аннотациях так и надо. У тебя указано, что класс первичного ключа UserRole такой:
Код

@IdClass(UserRolePK.class)

При этом я не вижу где он используется. Зато определены целых два первичных ключа - userId и roleId, не уверен, что это правильно. Кроме того, раз есть первичный, то его чем-то наполнить надо, а ты их пытаешься со значениями null сохранить. Заполни их идентификаторами пользователи и роли перед сохранением. 
PM MAIL Skype GTalk Jabber YIM   Вверх
unkis
  Дата 30.5.2007, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



а как бы ты замапил такую же конструкцию без аннотаций? можешь привести работающий пример?


--------------------
www.unkis.com
PM MAIL WWW   Вверх
tux
Дата 31.5.2007, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(unkis @  30.5.2007,  20:12 Найти цитируемый пост)
а как бы ты замапил такую же конструкцию без аннотаций?

Использовал бы composite-id.

Цитата(unkis @  30.5.2007,  20:12 Найти цитируемый пост)
можешь привести работающий пример? 

Не могу, к сожалению сейчас нет времени написать.
PM MAIL Skype GTalk Jabber YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0712 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.