2014-12-06 3 views
0

Я создаю одно приложение с использованием JPA, я хочу иметь родительский объект под названием «BaseEntity» с идентификатором атрибута, а затем остальные сущности, расширяющие этот объект, а затем имеющие свои собственные атрибуты. Идентификатор поля в родительском классе защищен. Однако, когда я запускаю сервер я получаю следующее сообщение об ошибке:Проблема с организацией JPA с идентификатором

вызвано следующими причинами: org.hibernate.AnnotationException: Нет идентификатор, указанный для объекта: com.fgonzalez.domainmodel.User

Конечно, если я помещаю id в классе User, он работает нормально, но это не то, что я хочу. Странно, если я использую xml-файлы для сопоставлений спящего режима вместо JPA, он отлично работает, но не с JPA. Любая идея, где может быть проблема? Прикрепленный код:

Base Entity:

public class BaseEntity implements Serializable{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 


@Id 
@GeneratedValue 
@Column(name="id") 
protected Long id; 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 


} 

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

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


/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

/** 
* 
*/ 

@Column(name="EMAIL",nullable=false,length=50,insertable=true,updatable=true) 
private String email; 

@Column(name="PASSWORD",nullable=false,length=50,insertable=true,updatable=true) 
private String password; 



public String getEmail() { 
    return email; 
} 
public void setEmail(String email) { 
    this.email=email; 
} 


public String getPassword() { 
    return password; 
} 
public void setPassword(String password) { 
    this.password = password; 
} 

} 

Спасибо заранее !!

ответ

2

Вы не можете этого сделать: BaseEntity не является @Entity, поэтому @Id даже не нужно обрабатывать.

Если Hibernate обрабатывает его при использовании xml, это, вероятно, не переносимая специфика.

Вы можете реализовать некоторую иерархию сущностей, но я бы этого не сделал в этом случае. Вы можете продлить один раз, и это не похоже на реальную иерархию: только один корень, разделяемый каждым классом?

Вы можете найти более подробную информацию о наследовании сущности здесь: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

Вы можете использовать композиции вместо наследования. В этом случае просто аннотируйте свой пользовательский класс (который не будет @Entity) с помощью @Embeddable и создайте поле, аннотированное с помощью @EmbeddedId в классе использования.

Тем не менее, я бы этого не делал: он кажется более сухим, но у него больше нет преимуществ, которые заменяют String повсюду чем-то другим, просто чтобы не повторять себя (что бы вы тогда все равно сделали).

У меня просто был бы @Id Long id; поле в каждой сущности, освобождая их от иерархического ада. Он выглядит более условным, но будет намного проще в долгосрочной перспективе, без очевидного недостатка.

0

Если вы собираетесь наследовать наследование в JPA, вы не должны делать что-то вроде java. JPA получила собственные стратегии внедрения. Посмотрите here и выберите тот, который наилучшим образом соответствует вашим потребностям

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