JPA外键在子表中为null [英] JPA foreign key is null in the child table

查看:743
本文介绍了JPA外键在子表中为null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有下面的课程,我正在尝试使用JPA来获得onetomany关系。当xml消息发送到restcontroller时,消息将同时存储父表和子表,但外键始终为空。请让我知道是否有任何问题。

休息服务,我用来坚持数据,下面是我发布到这个休息方法的示例XML。 / p>

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

子类

  @XmlRootElement 
@Entity
public class Player {

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

@Column(unique = true,nullable = false)
私有字符串名称;

@ManyToOne
@JoinColumn(name =team_id)
私人团队;

和setter和getters ....
}

和我的父类

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

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

@Column(unique = true,nullable = false)
私有字符串名称;

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

和setter和getter
}

@Service
@Transactional
public class TeamServiceImpl implements TeamService {

受保护的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(从a中选择一个);
列表<团队> resultList = query.getResultList();
返回resultList;
}

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

}



@Service
@Transactional
public class PlayerServiceImpl implements PlayerService {

受保护的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(从Player a中选择一个);
列表< Player> resultList = query.getResultList();
返回resultList;
}

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

}

和我的xml

 <团队> 
<名称> CSK< / name>
<玩家>
< player>
< name> kholi< / name>
< / player>
< player>
<名称>国王< /名称>
< / player>
< player>
< name> raja< / name>
< / player>
< / Players>
< / team>

下面是我在团队中创建条目后在表格中看到的结果。请注意player表中的team_id字段为空。这是我的问题。需要知道我该如何解决这个问题,这样该字段才能获得team_id的值。

  mysql>从团队中选择*; 
+ --------- + ------- +
| team_id |名称|
+ --------- + ------- +
| 1 |德里|
+ --------- + ------- +
1行设置(0.00秒)

mysql>从播放器中选择*;
+ ----------- + -------- + --------- +
| player_id |名称| team_id |
+ ----------- + -------- + --------- +
| 1 | kholi1 | NULL |
| 2 |国王| 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 |我| NULL |
| 14 | j | NULL |
| 15 | k | NULL |
| 16 | l | NULL |
| 17 | m | NULL |
| 18 | n | NULL |
| 20 | sdsdsd | NULL |
+ ----------- + -------- + --------- +
设置19行(0.00秒)


解决方案

看起来你已经保存了球员,但没有设置为他们的团队。
您应该像这样执行:

pre $ for(Player player:team.getPlayers())
player .setTeam(队);

另一种方式是只设置一个玩家属性 - 它的名字。 JPA无法自动检测到玩家是否在玩家集合中,而不是在团队中。


I have below classes i am trying to get onetomany relationship using JPA. When the xml message sent to restcontroller, the message is stored both parent and child table but foreign key is always null. Please let me know if any issue.

Rest Service which i am using to persist the data and the below is the sample xml which i am posting to this rest method.

@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 class

   @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....
}

and my parent class

   @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);
    }

}

and my xml

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

Below is the result i am seeing in the table after creating entry in team. Please note team_id field in player table is null. this is my issue. Need to know how i can fix it so that this field will get team_id value.

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)

解决方案

Looks like you've saved players, but didn't set Team for them. You should perform like this:

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

In another way only one property for player is set - its name. JPA is unable to automagically detect that if the player is in players collection than it is in the team.

这篇关于JPA外键在子表中为null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆