【问题标题】:Spring JPA - mapping foreign keys as a primary key [MySQL]Spring JPA - 将外键映射为主键 [MySQL]
【发布时间】:2017-01-03 00:48:05
【问题描述】:

我在将外键映射为主键时遇到问题。

我的桌子是:

client:
PK: id_client

games:
PK: id_game

tickets:
PK: (id_game_fk references game(id_game), id_client_fk references client(id_client))

以下是我定义为实体的类:

Client.java:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "client")
public class Client {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_client")
    private int id;

    public int getId() {
        return id;
    }

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

Games.java:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "games")
public class Games {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_game")
    private int id;

        public int getId() {
        return id;
    }

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

Ticket.java:

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import Client;
import Games;

@Entity
@Table(name = "tickets")
public class Ticket implements Serializable {
    private static final long serialVersionUID = 3287868602749718327L;

    @EmbeddedId
    private TicketId ticketId;

    @ManyToOne
    @JoinColumn(name = "id_game")
    private Games games;

    @ManyToOne
    @JoinColumn(name = "id_client")
    private Client client;

    public TicketId getId() {
        return ticketId;
    }

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

    public Games getGames() {
        return games;
    }

    public void setGames(Games games) {
        this.games = games;
    }

    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }
}

TicketId.java:

import java.io.Serializable;

import javax.persistence.Embeddable;

@Embeddable
public class TicketId implements Serializable {
    private static final long serialVersionUID = 6220676431741410239L;

    private int idGameFk;
    private int idClientFk;

    public TicketId(int idGameFk, int idClientFk) {
        this.idGameFk = idGameFk;
        this.idClientFk = idClientFk;
    }

    public int getIdGameFk() {
        return idGameFk;
    }

    public void setIdGameFk(int idGameFk) {
        this.idGameFk = idGameFk;
    }

    public int getIdClientFk() {
        return idClientFk;
    }

    public void setIdClientFk(int idClientFk) {
        this.idClientFk = idClientFk;
    }
}

到目前为止,我已经尝试了所有找到的建议,但没有一个有帮助。另外,我需要这个PK由外键组成,所以我真的需要帮助解决,我应该如何正确映射它。

【问题讨论】:

    标签: java mysql spring jpa entity


    【解决方案1】:

    你可以使用@MapsId:

    @Entity
    @Table(name = "tickets")
    public class Ticket implements Serializable {
        private static final long serialVersionUID = 3287868602749718327L;
    
        @EmbeddedId
        private TicketId ticketId;
    
        @ManyToOne
        @MapsId("idGameFk")
        @JoinColumn(name = "id_game_fk")
        private Games games;
    
        @ManyToOne
        @MapsId("idClientFk")
        @JoinColumn(name = "id_client_fk")
        private Client client;
    
        ....
    }
    

    更多信息在这里:http://docs.oracle.com/javaee/6/api/javax/persistence/MapsId.html

    【讨论】:

    • 好的,至少它现在可以编译了:D 但现在我在调用票据/com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'ticket0_.client_id_client' 时遇到以下异常在“字段列表”中
    • 已编辑答案,您可以试试我添加的内容吗?
    • 您可以尝试在您的票证顶部添加 '@Access(AccessType.FIELD) 吗?
    • 不,还是一样:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'ticket0_.client_id_client' in 'field list' 甚至猜不出是什么问题..跨度>
    • 现在的情况来了: '@Entity '@Table(name = "tickets") '@Access(AccessType.FIELD) public class Ticket implements Serializable { private static final long serialVersionUID = 3287868602749718327L; '@EmbeddedId private TicketId ticketId; '@ManyToOne '@MapsId("idGameFk") 私人游戏游戏; '@ManyToOne '@MapsId("idClientFk") 私人客户端客户端; }
    猜你喜欢
    • 2015-02-03
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多