2016-05-09 2 views
0

У меня есть классы, которые я пытаюсь получить onetomany отношения, используя JPA. Когда xml-сообщение отправляется на restcontroller, сообщение хранится как родительская, так и дочерняя таблица, но внешний ключ всегда равен нулю. Пожалуйста, дайте мне знать, если возникнет проблема.JPA внешний ключ имеет значение null в дочерней таблице

Служба отдыха, которую я использую, чтобы сохранить данные, а ниже - образец xml, который я отправляю в этот метод останова.

@RequestMapping(value="/team/", method = RequestMethod.POST , headers="Accept=application/xml") 
@ResponseStatus(value = HttpStatus.OK) 
public void createTeam(@RequestBody Team team) throws Exception { 
    teamService.createTeam(team); 
} 

класс Child

@XmlRootElement 
    @Entity 
    public class Player { 

     @Id 
     @GeneratedValue 
     @Column(name = "player_id") 
     private long player_id; 

     @Column(unique=true , nullable = false) 
     private String name; 

     @ManyToOne 
     @JoinColumn(name = "team_id") 
     private Team team; 

and setter and getters.... 
} 

и мой родительский класс

@XmlRootElement 
    @Entity(name ="team") 
    public class Team { 

     @Id 
     @GeneratedValue 
     @Column(name = "team_id") 
     private long team_id; 

     @Column(unique=true , nullable = false) 
     private String name; 

     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "team") 
     private List<Player> player; 

and setter and getter 
} 

@Service 
@Transactional 
public class TeamServiceImpl implements TeamService{ 

protected EntityManager entityManager; 

    public EntityManager getEntityManager() { 
     return entityManager; 
    } 

    @PersistenceContext 
    public void setEntityManager(EntityManager entityManager) { 
     this.entityManager = entityManager; 
    } 

    @Override 
    public List<Team> getTeam() { 
     Query query = getEntityManager().createQuery("select a from team a"); 
      List<Team> resultList = query.getResultList(); 
      return resultList; 
    } 

    @Override 
    public void createTeam(Team team) { 
     getEntityManager().persist(team); 
    } 

} 



@Service 
@Transactional 
public class PlayerServiceImpl implements PlayerService { 

    protected EntityManager entityManager; 

    public EntityManager getEntityManager() { 
     return entityManager; 
    } 

    @PersistenceContext 
    public void setEntityManager(EntityManager entityManager) { 
     this.entityManager = entityManager; 
    } 


    @Override 
    public List<Player> getPlayer() { 
     Query query = getEntityManager().createQuery("select a from Player a"); 
      List<Player> resultList = query.getResultList(); 
      return resultList; 
    } 

    @Override 
    public void createPlayer(Player player) { 
     getEntityManager().persist(player); 
    } 

} 

и мой XML

<team> 
<name>CSK</name> 
<Players> 
<player> 
    <name>kholi</name> 
</player> 
<player> 
    <name>king</name> 
</player> 
<player> 
    <name>raja</name> 
</player> 
</Players> 
</team> 

Ниже результат я вижу в таблице после создания записи в команде. Обратите внимание, что поле team_id в таблице игроков равно null. это моя проблема. Нужно знать, как я могу это исправить, чтобы это поле получило значение team_id.

mysql> select * from team; 
+---------+-------+ 
| team_id | name | 
+---------+-------+ 
|  1 | Delhi | 
+---------+-------+ 
1 row in set (0.00 sec) 

mysql> select * from player; 
+-----------+--------+---------+ 
| player_id | name | team_id | 
+-----------+--------+---------+ 
|   1 | kholi1 | NULL | 
|   2 | king | NULL | 
|   3 | raja | NULL | 
|   4 | kholi | NULL | 
|   5 | a  | NULL | 
|   6 | b  | NULL | 
|   7 | c  | NULL | 
|   8 | d  | NULL | 
|   9 | e  | NULL | 
|  10 | f  | NULL | 
|  11 | g  | NULL | 
|  12 | h  | NULL | 
|  13 | i  | NULL | 
|  14 | j  | NULL | 
|  15 | k  | NULL | 
|  16 | l  | NULL | 
|  17 | m  | NULL | 
|  18 | n  | NULL | 
|  20 | sdsdsd | NULL | 
+-----------+--------+---------+ 
19 rows in set (0.00 sec) 
+0

XML не имеет ничего общего с JPA. Где ваш код для извлечения объектов с использованием JPA и где вы проверили, что вы получили все поля, которые вам нужны? Это процесс под названием «отладка» –

+0

, где ваш код JPA для ПЕРСИСТЕМА объектов? вы установили ОБОИХ СТОРОННИХ СВЯЗИ BIDIRECTIONAL? и что такое SQL, вызываемый при выполнении этого (в журнале поставщика JPA). –

+0

обновлен с помощью restcontroller, который я использую, чтобы сохранить данные – OneTwo

ответ

0

Похоже, вы сохранили игроков, но не установили для них команду. Вы должны выполнить так:

for (Player player: team.getPlayers()) 
    player.setTeam(team); 

По-другому только одно свойство для игрока устанавливается - его имя. JPA неспособна автоматически распознавать, если игрок находится в коллекции игроков, чем в команде.

+0

обновил контроллер останова, который я использую, чтобы сохранить данные – OneTwo

+1

Как я уже говорил ранее: вы не устанавливаете ссылку на команду игроков. На каждом игроке вы должны вызвать player.setTeam. Обновлен мой ответ – asm0dey

+0

спасибо. теперь работает. – OneTwo

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