2015-02-12 3 views
0

У меня есть две таблицы, театры и шоу, к которым привязано одно-много картирование. Я пытаюсь выполнить постоянство коллекции следующим образом.Однократное сопоставление ConstraintViolationException в спящем режиме

public class Theater 
{ 

    private int theaterId; 

    private String theaterName; 

    private List<Shows> shows; 
    //getters and setters 
} 
public class Shows{ 
private int showId; 
    private String showType; 
    private int theaterId; 

//getters and setters 
} 

SessionFactory sf = new Configuration().configure().buildSessionFactory(); 
Session s = sf.openSession(); 
Transaction t = s.beginTransaction(); 
Theater th = new Theater("iNox"); 
th.setTheaterId(4); 

List<Shows> shs = new ArrayList<Shows>(); 
shs.add(new Shows("noon")); 
shs.add(new Shows("Drama")); 
th.setShows(shs); 
s.save(th); 
t.commit(); 
s.close(); 

отображения XML

<class name="hibernate.Theater" 
      table="theater"> 
     <id name="theaterId" 
      column ="theater_id"> 
      <generator class="increment"></generator> 
     </id> 
     <list name="shows" table = "shows" cascade = "all" inverse = "false"> 
      <key column="theater_id" /> 
      <index column="show_id"/> 
      <one-to-many class = "hibernate.Shows"/> 
     </list> 
     <property name = "theaterName" column = "theater_name" /> 
    </class>  

    <class name="hibernate.Shows" 
      table="shows"> 
     <id name="showId" 
      column ="show_id"> 
      <generator class="increment"></generator> 
     </id> 
     <property name = "showType" column = "show_type"/> 
     <property name = "theaterId" column = "theater_id"/> 
    </class> 

добавляющих соответствующие журналы здесь

12:19:43,435 DEBUG EntityPrinter:114 - Listing entities: 
    12:19:43,435 DEBUG EntityPrinter:121 - hibernate.Shows{showId=4, showType=Drama, theaterId=0} 
    12:19:43,435 DEBUG EntityPrinter:121 - hibernate.Theater{theaterName=iNox, theaterId=4, shows=[hibernate.Shows#3, hibernate.Shows#4]} 
    12:19:43,435 DEBUG EntityPrinter:121 - hibernate.Shows{showId=3, showType=noon, theaterId=0} 
    12:19:43,442 DEBUG SQL:109 - insert into sakila.theater (theater_name, theater_id) values (?, ?) 
    Hibernate: insert into sakila.theater (theater_name, theater_id) values (?, ?) 
12:19:43,445 TRACE BasicBinder:81 - binding parameter [1] as [VARCHAR] - [iNox] 
    12:19:43,445 TRACE BasicBinder:81 - binding parameter [2] as [INTEGER] - [4] 
    12:19:43,446 DEBUG SQL:109 - insert into sakila.shows (show_type, theater_id, show_id) values (?, ?, ?) 
    Hibernate: insert into sakila.shows (show_type, theater_id, show_id) values (?, ?, ?) 
12:19:43,447 TRACE BasicBinder:81 - binding parameter [1] as [VARCHAR] - [noon] 
    12:19:43,447 TRACE BasicBinder:81 - binding parameter [2] as [INTEGER] - [0] 
    12:19:43,447 TRACE BasicBinder:81 - binding parameter [3] as [INTEGER] - [3] 
    12:19:43,448 DEBUG SqlExceptionHelper:139 - could not execute statement [n/a] 
    com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails 

на основе журналов, я думаю theaterID (иностранный ключ, перешедший из театра таблицы) генерируются правильно (theaterID = 4) с помощью auto increment. Но при добавлении соответствующих шоу, театрия используется как 0. Может ли кто-нибудь указать мне на основную причину этой проблемы?

ответ

0

Похоже, я пытался использовать двунаправленную ассоциацию и забыл включать в себя многоточечное картографирование для театра в шоу-классе. Также, как было предложено The N, , необходимо было заменить театрисс ссылкой на Театр.

Добавлен следующего отображение

<many-to-one 
      name="theater" 
      cascade="all" 
      column = "theater_id" 
      class="hibernate.Theater"/> 

также обнаружил, что th.setTheaterId(4); должны быть удалены theaterId является автогенерируемым.

0

В шоу Pojo вы определили threaterId как int, однако это должен быть объект Threater pojo.

В спящем режиме, если вы хотите использовать отношения O2m, вам необходимо определить то же самое в pojo.

Так, что вам придется изменить вас Показывает POJO как

public class Shows{ 
private int showId; 
private String showType; 

@OneToMany 
@JoinColumn(name="theaterId") 
private Threater theater; 

//getters and setters 
} 

Это работает для меня. Пожалуйста, попробуйте

+0

ну ... для меня театрId - это внешний ключ в таблице «Шоу», поэтому я подумал об использовании его (вместо объекта «Театр»). Что-то не так с этим? – Swapnil

+0

В вашем pojo вы определили threatId как простую переменную int, которая должна быть объектом класса Threater [как я упоминал] вместо этого. В случае FK. –

Смежные вопросы