2014-11-04 3 views
0

БД Я хочу использовать что-то вроде:Hibernate: использование рк другого субъекта как рк дает org.hibernate.MappingException: Не удалось определить тип ошибок,

Таблица Пользователь: User_ID ...

User_Action Таблица: User_ID (Ф.К. к User.User_ID, должен быть один-к-одному) ...

Так у меня есть этот класс:

@Entity 
@Table(name="User") 
public class User { 

private long _ID; 
@Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "User_ID", nullable = false, unique = true) 
    public long get_ID() { 
     return _ID; 
    } 

    public void set_ID(long user_ID) { 
     _ID = user_ID; 
    } 
... 
} 

и в другом классе, у меня есть:

@Entity 
@Table(name="User_Action") 
public class UserAction implements IEntity { 

    private User _user; 
    @Id 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "User_ID") 
    public User get_user() { 
     return _user; 
    } 
    public void set_user(User _user) { 
     this._user = _user; 
    } 
... 
} 

Однако выполнение кода выдает следующее сообщение об ошибке в момент инициализации:

org.hibernate.MappingException: Could not determine type for: mycustom.User, for columns: [org.hibernate.mapping.Column(_user)] 
org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:266) 
org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:253) 
org.hibernate.mapping.RootClass.validate(RootClass.java:193) 
org.hibernate.cfg.Configuration.validate(Configuration.java:1099) 
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1284) 
org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) 

... 

Версии Hibernate я использую являются:

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>3.6.7.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>4.3.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-commons-annotations</artifactId> 
     <version>3.3.0.ga</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.3.1.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>3.3.2.GA</version> 
    </dependency> 

Я подозревал, что что-то не так с annoticationConfiguration, но не в состоянии подтвердить или отлаживать .. или это что-то еще?

+1

Вы аннотировали свое пользовательское свойство с аннотацией Id. Но эта аннотация может применяться только к определенным типам (подробнее см. Здесь: http://docs.oracle.com/javaee/6/api/javax/persistence/Id.html). Если вы хотите использовать объект в качестве ПК другого лица, взгляните на эту публикацию SO: http://stackoverflow.com/questions/904634/using-and-entity-and-their-primary-key-as-another- entitys-идентификатор. –

ответ

0

Несколько вещей, чтобы изменить:

1) ликвидировать подчеркивание («_») от имен свойств вашего класса. Попытайтесь следовать за Java Beans naming conventions. Это важно, потому что Hibernate ожидает такого типа именования, чтобы называть общедоступные аксессоры классов и мутаторы (ака. Геттеры & сеттеры).

2) UserAction нуждается в собственном свойстве идентификатора. У указанного свойства должен быть аннотированный геттер с @Id. Вы в настоящее время аннотировали UserAction_user недвижимость с @Id, что, несомненно, вызовет проблемы. UserAction будет иметь свой собственный первичный ключ и будет иметь идентификатор User как внешний ключ.

3) Рассмотрите возможность изменения отношения «один-к-одному» к «одному-ко-многим». Нельзя ли разрешить User выполнить более одного UserAction?

+0

Спасибо за ваш ответ. Просто для того, чтобы следить за ним: 2) UserAction использует внешний ключ в качестве основного ключа, но я не уверен, как представить это в классе, поэтому я оставил @id для _user в UserAction. Итак, возникает вопрос, как сделать супертипную вещь в спящем режиме? и 3) да, это действительно один-ко-многим, я просто использую 1-1, чтобы держать его простым, поскольку это имеет отношение к проблеме. – jamesdeath123