2012-10-27 3 views
0

J'améliore actuellement un ancien projet qui fonctionne bien, je n'ai pas besoin de modifier le code ni la base de données, tout ce que je peux faire c'est de créer le mapping correct ...Association de classe Java JPA, NullPointerException?

Il y a l'Acteur, classes de rôle et de cinéma ... Avec 3 tables respectives dans la base de données:

Table '' Acteur:

`id` INT 
`name` VARCHAR 

Table 'rôle':

`film` INT 
`actor` INT 
`role` VARCHAR 
PRIMARY KEY (film, actor, role) 
FOREIGN KEY (film) REFERENCES film(id) 

Table « Film »:

`id` INT 
`title` VARCHAR 

Donc il y a deux associations à faire, [Un acteur a un rôle dans un seul film], et [un film contient des rôles nombreux associés à leurs acteurs de] respectives.

Et au fond, il devrait y avoir une méthode dans la classe de film qui permet de créer un nouveau rôle associé à un acteur

film.createRole(actor, "Role"); //returning a role 

Je reçois tout le temps la même erreur: Java NullPointerException de Mise en veille prolongée. Je suppose qu'il y a une idée fausse dans mon code, une idée de comment je peux faire le mapping correct?

code:

Movie.java:

@Entity 
@Table(name = "movie") 
public class Movie implements Serializable 
{ 
@Id 
@GeneratedValue 
private int id; 
private String title; 

@OneToMany 
@JoinTable(name = "role", 
joinColumns = { 
@JoinColumn(name="role") 
} 
) 
private List<Role> roles; 

//Getters and setters 

public Role createRole(Actor actor, String role) 
{ 
Role myRole = new Role(); 
RoleId roleId = new RoleId(); 
roleId.setMovie(this.id); 
roleId.setRole(role); 
roleId.setActor(actor.getId()); 
myRole.setId(roleId); 
return myRole; 
} 
} 

Role.java:

@Entity 
@Table(name = "role") 
public class Role implements Serializable 
{ 
@EmbeddedId 
private RoleId roleId; 

//Getters and setters 
} 

RoleId.java:

@Embeddable 
public class RoleId implements Serializable 
{ 

@ManyToOne(optional=true) 
@JoinTable(name = "role", joinColumns = { 
@JoinColumn(name="movie")}) 
private int movie; 

@ManyToOne(optional=true) 
@JoinTable(name = "role", joinColumns = { 
@JoinColumn(name="actor") 
}) 
private int actor; 

private String role; 

//Getters and setters 
} 

Actor.java:

@Entity 
@Table(name = "actor") 
public class Actor implements Serializable 
{ 
@Id 
@GeneratedValue 
private int id; 
private String name; 


@OneToMany 
@JoinTable(name = "role", joinColumns = { 
@JoinColumn(name="role", unique = true) }) 
private List<Role> roles; 

//Getters and setters 

} 

Où est l'erreur alors? Merci.

+2

Où est le stacktrace? –

+0

vous pouvez formater votre question un peu mieux pour le rendre lisible! – Vikdor

+2

Vraiment besoin de voir un stacktrace pour vous aider davantage. – JamesB

Répondre

1

Je pense que vous avez un mappage d'annotation incorrect. Voyez comment je l'ai fait.

RoleId

import java.io.Serializable; 

import javax.persistence.Embeddable; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 

@Embeddable 
public class RoleId implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "movie") 
    private Movie movie; 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "actor") 
    private Actor actor; 

    private String role; 

    public Movie getMovie() { 
     return movie; 
    } 

    public void setMovie(Movie movie) { 
     this.movie = movie; 
    } 

    public Actor getActor() { 
     return actor; 
    } 

    public void setActor(Actor actor) { 
     this.actor = actor; 
    } 

    public String getRole() { 
     return role; 
    } 

    public void setRole(String role) { 
     this.role = role; 
    } 

    @Override 
    public String toString() { 
     return "movie=" + movie.getTitle() + ", actor=" + actor.getName() 
       + ", role=" + role; 
    } 
} 

Rôle

@Entity 
@Table(name = "role") 
public class Role implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private RoleId id; 

    public RoleId getId() { 
     return id; 
    } 

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

    @Override 
    public String toString() { 
     return getId().toString(); 
    } 
} 

Acteur

@Entity 
@Table(name = "actor") 
public class Actor implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 
    private String name; 

    @OneToMany 
    @JoinColumn(name = "actor") 
    private List<Role> roles; 

    public int getId() { 
     return id; 
    } 

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

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<Role> getRoles() { 
     return roles; 
    } 

    public void setRoles(List<Role> roles) { 
     this.roles = roles; 
    } 

    @Override 
    public String toString() { 
     StringBuilder builder = new StringBuilder(124); 
     builder.append(name).append(" roles "); 
     builder.append(Arrays.toString(roles.toArray())); 
     return builder.toString(); 
    } 
} 

Film

@Entity 
@Table(name = "movie") 
public class Movie implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    private String title; 

    @OneToMany 
    @JoinColumn(name = "movie") 
    private List<Role> roles; 

    public Role createRole(Actor actor, String role) { 
     Role myRole = new Role(); 
     RoleId roleId = new RoleId(); 
     roleId.setMovie(this); 
     roleId.setRole(role); 
     roleId.setActor(actor); 
     myRole.setId(roleId); 
     return myRole; 
    } 

    public int getId() { 
     return id; 
    } 

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

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public List<Role> getRoles() { 
     return roles; 
    } 

    public void setRoles(List<Role> roles) { 
     this.roles = roles; 
    } 

    @Override 
    public String toString() { 
     StringBuilder builder = new StringBuilder(124); 
     builder.append(title).append(" roles "); 
     builder.append(Arrays.toString(roles.toArray())); 
     return builder.toString(); 
    } 
} 

tables MySQL

CREATE TABLE `actor` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

CREATE TABLE `movie` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

CREATE TABLE `role` (
    `movie` bigint(20) NOT NULL, 
    `actor` bigint(20) NOT NULL, 
    `role` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`movie`,`actor`,`role`), 
    CONSTRAINT `role_movie_movie` FOREIGN KEY (`movie`) REFERENCES `movie` (`id`), 
    CONSTRAINT `role_actor_actor` FOREIGN KEY (`actor`) REFERENCES `actor` (`id`) 
) ENGINE=InnoDB; 
INSERT INTO actor(name) VALUES('Arnold Schwarzenegger'); 
INSERT INTO actor(name) VALUES('Michael Biehn'); 
INSERT INTO actor(name) VALUES('Linda Hamilton'); 

INSERT INTO movie(title) VALUES('Termiantor'); 

INSERT INTO role VALUES(1, 1, 'Terminator'); 
INSERT INTO role VALUES(1, 2, 'Kyle Reese'); 
INSERT INTO role VALUES(1, 3, 'Sara Connor'); 

Après l'exécution ci-dessous le code source:

public static void main(String[] args) { 
    movieTest(); 
} 

public static void movieTest() { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    showEntities(session, Movie.class, "Movies"); 
    showEntities(session, Actor.class, "Actors"); 
    showEntities(session, Role.class, "Roles"); 
} 

private static void showEntities(Session session, Class<?> entity, 
     String name) { 
    System.out.println(name); 
    for (Object item : session.createCriteria(entity).list()) { 
     System.out.println(item); 
    } 
} 

Vous verrez la sortie comme ça

Movies 
Termiantor roles [movie=Termiantor, actor=Arnold Schwarzenegger, role=Terminator, movie=Termiantor, actor=Michael Biehn, role=Kyle Reese, movie=Termiantor, actor=Linda Hamilton, role=Sara Connor] 
Actors 
Arnold Schwarzenegger roles [movie=Termiantor, actor=Arnold Schwarzenegger, role=Terminator] 
Michael Biehn roles [movie=Termiantor, actor=Michael Biehn, role=Kyle Reese] 
Linda Hamilton roles [movie=Termiantor, actor=Linda Hamilton, role=Sara Connor] 
Roles 
movie=Termiantor, actor=Arnold Schwarzenegger, role=Terminator 
movie=Termiantor, actor=Michael Biehn, role=Kyle Reese 
movie=Termiantor, actor=Linda Hamilton, role=Sara Connor