Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JPA mapping


Автор: ПашкаКорчагин 18.4.2008, 19:47
Пытаюсь освоить JPA.. написал простенький .. классический пример с Person...
есть БД... есть таблицы Реrson, Address, Phone i Employee
описал Entities... где Employee extends Person
Person знает свой адресс (OneToOne relation)  и свои телефоны (OneToMany)
проблема в том, что при тестировании PhoneEntity вылетает исключение 

javax.persistence.PersistenceException: org.hibernate.HibernateException: More than one row with the given identifier was found: 1, for class: demo.persistence.Person

Тесты Person отрабатывают нормально

PhoneEntity
Код

@Entity
@Table(name = "Phone")
@NamedQueries({
@NamedQuery(name = "Phone.selectAll", query = "SELECT p FROM Phone p")})
public class Phone  implements Serializable {
    @Id
    @GeneratedValue  (strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false)
    private Integer id;
    @Column(name = "type", nullable = false)
    private String type;
    @Column(name = "value", nullable = false)
    private String value;

    @JoinColumn(name = "personId") //в таблице Phone -personId внешний ключ на Person
    @ManyToOne (cascade = CascadeType.ALL)
    private Person personId;
.
.
.



ну и Person

Код

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "Person")
@NamedQueries({
@NamedQuery(name = "Person.selectAll", query = "SELECT p FROM Person p")})
public class Person implements Serializable {
    @Id
    @GeneratedValue (strategy = GenerationType.TABLE)
    @Column(name = "id", nullable = false)
    private Integer id;

    @Column(name = "firstName", nullable = false)
    private String firstName;

    @Column(name = "lastName", nullable = false)
    private String lastName;    

    @OneToMany(mappedBy = "personId")
    private Collection<Phone> phoneCollection;

    
    @JoinColumn(name = "addressId", referencedColumnName = "id")
    @OneToOne
    private Address addressId;







Автор: makados 19.4.2008, 02:16
по-видимому, у тебя проблема с тестовыми данными. Ты дергаешь класс Person по айдишнику, который одинаков у нескольких записей. А, как известно, ID должен быть уникальным

Автор: ПашкаКорчагин 19.4.2008, 16:38
на самом деле.. пока просто пытаюсь селектить все телефони.. и проверяю список на null


  
Код

  @Test
    public void testLoadAll() throws InvocationTargetException, IllegalAccessException {
        Query query = em.createNamedQuery("Phone.selectAll");
        List<Phone> addresses = query.getResultList();
        assertNotNull(addresses);
        assertTrue(addresses.size() > 0);
    }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)