JPA OneToOne отношения - PullRequest
5 голосов
/ 21 июля 2011

Я строю проект, используя платформу Play, и у меня возникают проблемы с освоением JPA @OneToOne relationships.

В настоящее время у меня есть два класса:

Объект пользователя

@Entity
@Table( name="users" )
public class Users extends Model {

    @OneToOne( mappedBy="userId", fetch=FetchType.LAZY, cascade = CascadeType.ALL )
    @ForeignKey( name="userId", inverseName="userId" )
    UserSettings userSettings;
    public userId;
    public userName;
}

Настройки пользователя

@Entity
@Table( name="user_settings" )
public class UserSettings extends Model {

    @OneToOne( cascade = CascadeType.ALL,targetEntity=User.class )
    public String userId;
    public String xml;

    public UserSettings( String userId ){
        this.userId = userId;
    }
}

Идея состоит в том, что я пытаюсь установить поле userId в User как внешний ключ в UserSettings.Я пробовал несколько разных способов добиться этого, и мой код всегда выдает ошибку.Наиболее распространенная ошибка, которую я получаю: Ссылочное свойство не является (One | Many) ToOne .

Однако, когда я пытаюсь установить userId в UserSettings, используя код выше, Я получаю следующее исключение:

Обнаружено исключение javax.persistence.PersistenceException, org.hibernate.PropertyAccessException: не удалось получить значение поля по отражателю getter для reader.User.id

Может кто-нибудь помочь объяснить, как я могу достичь желаемой цели?

Ответы [ 2 ]

5 голосов
/ 21 июля 2011

Чтение раздела 5.2 ссылки на спящий режим о разнице между сущностями и значениями. Вы пытаетесь сопоставить строку как сущность. Только сущности могут быть (One | Many) ToOne, как говорит ошибка. То есть вместо String userId вы должны использовать User user, а вместо mappedBy="userId", mappedBy="user".

0 голосов
/ 24 июля 2011

Если вы расширяете Model, Play генерирует первичный ключ "id" по умолчанию для каждого объекта. Если это не то, что вам нужно, вы должны вместо этого расширить базовую модель.

Самый простой способ - использовать пользователя в качестве свойства пользовательских настроек:


@Entity
@Table( name="user_settings" )
public class UserSettings extends Model{
    @OneToOne
    public Users user;
...

@Entity
@Table( name="users" )
public class Users extends Model {
    @OneToOne(cascade = CascadeType.ALL)
    public UserSettings settings;

Сохранение пользовательских и пользовательских настроек в каждом объекте с OneToOne позволяет выполнять двунаправленный поиск.
Если вы хотите использовать свой собственный ключ, измените его с Model на GenericModel и определили свой внешний ключ для объекта пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...