2009-12-22 1 views
2

Я пытаюсь создать экземпляр EntityManager, если я добавлю столбец OneToMany классу, который уже имеет столбец OneToMany.EntityManager не может создать экземпляр, используя JPA/Hibernate, когда добавляю аннотацию OneToMany.

Сейчас у EducationInfo есть пользователь OneToOne, так как каждая строка будет уникальной для человека, но я хочу, чтобы иметь возможность загружать всю информацию об образовании с указанием имени пользователя.

Я не изменяю файл orm.xml, когда добавляю столбец, я просто отбрасываю базу данных, чтобы ее можно было воссоздать.

class User { 
    @Id 
    @GeneratedValue(){val strategy = GenerationType.AUTO} 
    var id : Int = _ 

    @Column{val nullable = false, val length=32} 
    var firstName : String = "" 
    var lastName : String = "" 

    @Column{val nullable = false, val unique = true, val length = 30} 
    var username : String = "" 

    @OneToMany{val fetch = FetchType.EAGER, val cascade=Array(CascadeType.ALL)} 
    var address : java.util.List[Address] = new java.util.ArrayList[Address]() 

    @OneToMany{val fetch = FetchType.EAGER, val cascade=Array(CascadeType.ALL), val mappedBy="user"} 
    var educationInfo : java.util.List[EducationInfo] = new java.util.ArrayList[EducationInfo]() 

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

Вот класс он пытается использовать, и модульные тесты для этого класса работает отлично:

@Entity 
@Table{val name="educationinfo"} 
class EducationInfo { 
    @Id 
    @GeneratedValue(){val strategy = GenerationType.AUTO} 
    var id : Long = _ 

    @Column{val nullable = false, val length = 100} 
    var name : String = ""; 

    @OneToOne{val fetch = FetchType.EAGER, val cascade = Array(CascadeType.PERSIST, CascadeType.REMOVE)} 
    @JoinColumn{val name = "educationinfo_address_fk", val nullable = false} 
    var location : Address = _ 

    @ManyToOne{val fetch = FetchType.LAZY, val cascade=Array(CascadeType.PERSIST)} 
    @JoinColumn{val name = "educationinfo_user_fk", val nullable = false} 
    var user : User = _ 

    @Column{val nullable = false, val length = 100} 
    var degree : String = "" 

    @Temporal(TemporalType.DATE) 
    @Column{val nullable = true} 
    var startyear : Date = new Date() 
    var endyear : Date = new Date() 

    @Column{val nullable = true, val length = 1000} 
    var description : String = "" 
} 

Я также интересно, если есть какой-нибудь способ узнать, что ошибка в том, что мешает EntityManager от экземпляра, но основная проблема заключается в том, что может вызвать проблему, когда я добавляю этот столбец в User?

UPDATE:

Удалены часть, которая была ошибкой.

UPDATE 2:

Я изменил столбец пользователя в сущности образования, чтобы быть @ManyToOne и все мои модульных тестов не удалось.

Конец моего журнала ошибок заключается в следующем:

15035 [main] INFO org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo 
15035 [main] INFO org.hibernate.cfg.SettingsFactory - Named query checking : enabled 
15047 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory 
[PersistenceUnit: jpaweb] Unable to build EntityManagerFactory 
[PersistenceUnit: jpaweb] Unable to build EntityManagerFactory 

Тогда EntityManager равно нулю во всех тестах, так что не удается.

UPDATE 3:

Address предприятие не имеет внешних ключей ни к чему, так как она вызывается из нескольких лиц.

Возможно, эта проблема возникла из-за использования Apache Derby в качестве базы данных?

К сожалению, у меня нет сообщений об ошибке. Я запускаю это изнутри maven, и хотя я удаляю базу данных каждый раз, когда я не могу сказать, что это происходит, это неправильно. @ManyToOne из EducationInfo -> Пользователь не вызывает никаких проблем, но @OneToMany -> EducationInfo от пользователя.

UPDATE 4:

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

FINAL UPDATE:

Фактический случай был

не может одновременно получать несколько мешков

так что я просто удалил FetchType полностью из EducationInfo и проблема ушла. отображение дополнение

+0

Были ли вы распечатаны фактическая трассировка ошибок/стека? Единственное, что выглядит несколько подозрительно, это '@ OneToOne' от' EducationInfo' до 'Address', но это не должно быть проблемой, поскольку он отображается через FK. Имеет ли 'Адрес' какие-либо сопоставления' @ OneToOne'? Получение сообщения об ошибке Hibernate для печати наиболее важно здесь, оно покажет вам, где искать ошибку. – ChssPly76

+0

Мне жаль, что я не могу получить стек, но я не понимаю, как его получить. –

+0

Я только заметил (аннотации выглядят несколько иначе в Scala), что у вас нет 'mappedBy', установленного на @OneToMany. Вы должны: 'mappedBy =" user "' - это означало бы, что ассоциация поддерживается таблицей «EducationInfo». – ChssPly76

ответ

3

OneToMany «S на другой стороне ассоциации ManyToOne, он не может быть OneToOne. Это то, что приводит к ошибке EntityManager.

Это работает, когда вы удалите последнюю строку из User, потому что тогда вы только остается OneToMany к Address и, хотя и не показано здесь, по-видимому Address не имеет OneToOne ссылку User.

Я не эксперт Scala; в Java вы обычно получаете ошибку и трассировку стека, когда EntityManager не удается инициализировать; сообщение об ошибке не всегда является чрезвычайно описательным, но обычно говорит, с каким картографированием возникает проблема. Возможно, вам нужно настроить настройки ведения журнала, если вы не получите эту ошибку.

я не совсем понимаю вашу модель:

В принципе, пользователь должен иметь возможность иметь несколько адресов, так что я ожидаю, что это станет ManyToMany, но каждый использовать также может иметь несколько экземпляры информации об образовании, поэтому необходимо, чтобы ManyToOne.

Это звучит как @OneToMany от User до Address мне и (если «использовать» означает «пользователь») как @OneToMany от User к EducationInfo.

Сейчас EducationInfo имеет OneToOne для пользователя, так как каждая строка будет быть уникальной для человека, но я хочу быть в состоянии загрузить все образование информации по заданному имени пользователя.

Это противоречит вышеприведенному. Либо вы можете иметь несколько EducationInfo за User, либо это «уникально для человека».

+0

Адрес имел ссылку OneToOne, но я понял, что адрес может быть общим. Спасибо, что заметили опечатку. Я сделаю изменения и посмотрю, что произойдет. –

+0

Это все еще OneToOne на пользователе в EducationInfo. Это все еще должно быть ManyToOne –

+0

Я обновил свой ответ, измененный на @ManyToOne, и он все еще терпит неудачу. –

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