JPA Генерация ключей в классе многих сторон - PullRequest
1 голос
/ 06 августа 2011

Я новичок в JPA.Я хочу понять, какую помощь дает мне JPA в сохранении объектов в базе данных.Мой пример: класс Person связан с классом Address.Каждый человек может иметь несколько адресов.Я моделирую этот факт следующим образом:

@Entity
public class Person implements Serializable {
    @Id int id; 
    String firstName;
    @OneToMany(mappedBy="id", cascade={CascadeType.PERSIST, CascadeType.REMOVE})
    List<EMailAddress> emailList;
    //of course i have all my getters

Мой класс EmailAddress похож:

@Entity 
    public  class EMailAddress implements Serializable {
        @Id @GeneratedValue (strategy=GenerationType.TABLE)
        Integer id;
        String address;
        //here i have all my getters
   }

ОК.Первая проблема заключается в том, что когда я пытаюсь сохранить объект person со следующим очень простым кодом, я получаю ошибку внешнего ключа:

    Person p0 = new Person();
    p0.setFirstName("Alan");
    p0.setId(99);
    //I create an EMailAddress object, and add it to the Person adresses list
    EMailAddress ma = new EMailAddress();
    ma.setAddress("Alan@sample.world");
    p0.setEmailList(new ArrayList());
    p0.getEmailList().add(ma);

    em.getTransaction().begin();
    em.persist(p0);
    em.getTransaction().commit();

Исключение:


10924 [main] ERROR org.hibernate.util.JDBCExceptionReporter - INSERT on table 'EMAILADRESS' has caused a violation of foreign key constraint 'FK95CEBD60BE95C400' for key (327680).  The instruction has been rollbacked.

1 Ответ

2 голосов
/ 06 августа 2011

Ваше отображение первичного ключа EMailAddress в качестве внешнего ключа для Person. Поскольку не существует Person с идентификатором EMailAddress (вероятно, 1 как @GeneratedValue 'ed), вы видите это исключение. Измените отображение вашей личности на что-то вроде:

@OneToMany(mappedBy="USER_ID", cascade={CascadeType.PERSIST, CascadeType.REMOVE})
List<EMailAddress> emailList;

И это должно работать. Обязательно обновите схему БД, если у вас нет спящего режима, создайте ее для себя. Добавьте столбец USER_ID с ограничением внешнего ключа в Person.ID.

...