Pergunta

Ainda estou aprendendo a configurar esses mapeamentos usando as anotações JPA, para que isso possa ser um erro para iniciantes.

Eu tenho uma classe de usuário e uma classe de curso. No banco de dados, cada curso possui uma chave estrangeira do usuário em cada linha (pense no usuário como o professor que ensina o curso). Portanto, cada usuário pode ter vários cursos, mas cada curso possui apenas um usuário.

Ao mapear essas aulas, escrevi o seguinte código abaixo:

@Entity
public class User extends BaseModel {

 @OneToMany(mappedBy="course")
 private Collection<Course> courses;

 public void setCourses(Collection<Course> courses) { this.courses = courses; }

 public Collection<Course> getCourses() { return courses; }

}

@Entity
public class Course extends BaseModel {

 @ManyToOne
 @JoinColumn(name="user_id")
 private User user;

 public void setUser(User user) { this.user = user; }

 public User getUser() { return user; }

}

Eu omiti os campos irrelevantes e o modelo BasEmodel apenas explica a chave primária em cada tabela. Existe algo que esteja descaradamente errado aqui? Caso contrário, o que seria uma boa maneira de depurar um problema como esse.

Estou recebendo uma NullPointerException quando tento ligar para uma seleção na tabela de usuários. No entanto, quando retiro as referências à classe do curso na classe de usuário, tudo funciona perfeitamente bem.

A linha em questão está na minha classe Dao. Talvez o gerente de entidade esteja deixando de inicializar. Aqui está o código.

Query query = Stripersist.getEntityManager().createQuery(getQuery(fieldName, null)).setParameter(fieldName, value);

createEquery () apenas retorna:

String query = "FROM " + entityClass.getName() + " t WHERE t." + fieldName + " = :" + fieldName;

Estou usando a estrutura do Stripes, o Hibernate e o Stripersist, se isso fornecer mais pistas sobre o que está errado.

Foi útil?

Solução

Desde o primeiro olhar, parece ser que você deve escrever:

@OneToMany(mappedBy="user") 
private Collection<Course> courses; 

I. e. em @onetomany Mappedby deve apontar para o campo que aponta para o objeto atual.

Outras dicas

Mappedby indica que a entidade deste lado é o inverso do relacionamento, e o proprietário reside na entidade "outra". No seu caso, como o AxTAVT respondeu deve ser:

@OneToMany(mappedBy="user")
private Collection<Course> courses;

Estados que o usuário pode optar por muitos cursos e o curso está carregando a propriedade dessa relação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top