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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EJB 3.0 and Many-To-Many, Cannot add or update a child row 
V
    Опции темы
Asal
Дата 5.3.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 7



Всем привет.

Есть три таблицы: table1, table2, table3
Код

-- -----------------------------------------------------
-- Table `jetscart`.`table1`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `jetscart`.`table1` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `jetscart`.`table2`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `jetscart`.`table2` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `jetscart`.`table3`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `jetscart`.`table3` (
  `table1_id` INT UNSIGNED NOT NULL ,
  `table2_id` INT UNSIGNED NOT NULL ,
  `value` INT NULL ,
  PRIMARY KEY (`table1_id`, `table2_id`) ,
  INDEX `fk_table3_table1` (`table1_id` ASC) ,
  INDEX `fk_table3_table2` (`table2_id` ASC) ,
  CONSTRAINT `fk_table3_table1`
    FOREIGN KEY (`table1_id` )
    REFERENCES `jetscart`.`table1` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_table3_table2`
    FOREIGN KEY (`table2_id` )
    REFERENCES `jetscart`.`table2` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

И классы к ним
Table1
Код

@Entity
@Table(catalog = "jetscart", name = "table1")
public class Table1 {
...

    private Collection<Table3> table3sById;

    @OneToMany(mappedBy = "table1ByTable1Id", cascade = CascadeType.ALL)
    public Collection<Table3> getTable3sById() {
        return table3sById;
    }

    public void setTable3sById(Collection<Table3> table3sById) {
        this.table3sById = table3sById;
    }
}

Table2
Код

@Entity
@Table(catalog = "jetscart", name = "table2")
public class Table2 {
   .............

    private Collection<Table3> table3sById;

    @OneToMany(mappedBy = "table2ByTable2Id", cascade = CascadeType.ALL)
    public Collection<Table3> getTable3sById() {
        return table3sById;
    }

    public void setTable3sById(Collection<Table3> table3sById) {
        this.table3sById = table3sById;
    }

Table3
Код

@Entity
@Table(catalog = "jetscart", name = "table3")
@IdClass(Table3PK.class)
public class Table3 {
    ......

    private Table2 table2ByTable2Id;

    @ManyToOne
    @JoinColumn(name = "table2_id", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
    public Table2 getTable2ByTable2Id() {
        return table2ByTable2Id;
    }

    public void setTable2ByTable2Id(Table2 table2ByTable2Id) {
        this.table2ByTable2Id = table2ByTable2Id;
    }

    private Table1 table1ByTable1Id;

    @ManyToOne
    @JoinColumn(name = "table1_id", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
    public Table1 getTable1ByTable1Id() {
        return table1ByTable1Id;
    }

    public void setTable1ByTable1Id(Table1 table1ByTable1Id) {
        this.table1ByTable1Id = table1ByTable1Id;
    }
}


Класс SLB
Код

@Remote(TestRemote.class)
@Stateless(mappedName = "ejb/TestService", name = "TestRemoteEJB")
public class Test {
    @PersistenceContext(unitName = "JetscartUnit", type = PersistenceContextType.TRANSACTION)
    protected EntityManager em;

    @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    public void test() {
        Table1 table1 = new Table1();
        Table2 table2 = new Table2();
        Table3 table3 = new Table3();

        ArrayList<Table3> table3ArrayList = new ArrayList<Table3>(1);
        table3ArrayList.add(table3);

        table1.setTable3sById(table3ArrayList);

        table2.setTable3sById(table3ArrayList);

        table3.setTable1ByTable1Id(table1);
        table3.setTable2ByTable2Id(table2);

        em.persist(table1);
        em.persist(table2);
        em.persist(table3);
    }
}


после выхода из метода получаю
Цитата

[#|2009-03-05T15:42:45.519+0200|FINE|sun-appserver9.1|......|INSERT INTO jetscart.table1 (id) VALUES (?)
    bind => [0]|#]

[#|2009-03-05T15:42:45.566+0200|FINE|sun-appserver9.1|......|INSERT INTO jetscart.table2 (id) VALUES (?)
    bind => [0]|#]

[#|2009-03-05T15:42:45.613+0200|FINE|sun-appserver9.1|......|INSERT INTO jetscart.table3 (table1_id, table2_id, value) VALUES (?, ?, ?)
    bind => [0, 0, 0]|#]

[#|2009-03-05T15:42:45.660+0200|WARNING|sun-appserver9.1|.....|
Local Exception Stack: 
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`jetscart/table3`, CONSTRAINT `fk_table3_table1` FOREIGN KEY (`table1_id`) REFERENCES `table1` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
Error Code: 1452
Call: INSERT INTO jetscart.table3 (table1_id, table2_id, value) VALUES (?, ?, ?)
    bind => [0, 0, 0]
Query: InsertObjectQuery(com.jetscart.model.Table3@0)
    at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:311)
    at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:654)
    at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:703)




Сбствено вопрос:
Что у меня не правильно и как бороться с этой ошибкой ?

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  relations.JPG 10,75 Kb


--------------------
PM MAIL ICQ   Вверх
AntonSaburov
Дата 5.3.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 8
Всего: 118



ну ошибка ссылочной целостности - попытка вставить значение FK в child-таблицу которого нет в parent-таблице.
PM MAIL WWW ICQ   Вверх
Asal
Дата 5.3.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 7



это я понимаю.
Но в теории эти три вставки должны проходить в одной транзакции и проблем не должно быть,
а они есть...


--------------------
PM MAIL ICQ   Вверх
Asal
Дата 5.3.2009, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 7



Решение найдено.
Надо добавить генераторы ключей
Table1
Код

@Entity
@Table(catalog = "jetscart", name = "table1")
public class Table1 {
    private long id;

    @Id
    @Column(name = "id", nullable = false, length = 10)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE1_SEQ")
    @TableGenerator(name="TABLE1_SEQ", catalog = "jetscart")
    public long getId() {
        return id;
    }

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

Table2
Код

@Entity
@Table(catalog = "jetscart", name = "table2")
public class Table2 {
    private long id;

    @Id
    @Column(name = "id", nullable = false, length = 10)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE2_SEQ")
    @TableGenerator(name="TABLE2_SEQ", catalog = "jetscart")
    public long getId() {
        return id;
    }

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

Класс SLB
Код

@Remote(TestRemote.class)
@Stateless(mappedName = "ejb/TestService", name = "TestRemoteEJB")
public class Test {
    @PersistenceContext(unitName = "JetscartUnit", type = PersistenceContextType.TRANSACTION)
    protected EntityManager em;

    @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    public void test() {
        Table1 table1 = new Table1();
        Table2 table2 = new Table2();
        Table3 table3 = new Table3();

        ArrayList<Table3> table3ArrayList = new ArrayList<Table3>(1);
        table3ArrayList.add(table3);

        em.persist(table1);
        em.persist(table2);

        table3.setTable1Id(table1.getId());
        table3.setTable2Id(table2.getId());

        table1.setTable3sById(table3ArrayList);
    }
}



--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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