簡體   English   中英

設計帶有 2 個外鍵的 Spring Data jpa 注釋類

[英]design spring data jpa annotated class with 2 foreign keys

因此,作為練習,我使用 Spring 構建了一個 Java Web 應用程序。 這是一個簡單的彩票 API。

我決定在這個項目中使用 spring 數據 JPA,我是基於 ORM 的數據庫訪問的新手。
我也在使用 flyway 進行數據版本控制。 因此,我使用 flyway 腳本生成 db,然后根據我的 spring 數據 jpa 模型對其進行驗證。

它非常復雜……但最終我認為它提供的不僅僅是使事情復雜化。

所以我有3張桌子

RAFFLE
raffleID - primmary key
startDate
endDate
winningNumbers

TICKETS
ticketID - primmary key
raffleID - foreign key
customerName
numbers

WINNERS
ticketID - foreignKey
raffleID - foreignKey
Amount
Type

這是糟糕的設計嗎? 我還應該為 WINNERS 表使用主鍵嗎? 是否可以創建 PFK ? 我使用 MariaDB 作為數據庫。

到目前為止我的彈簧代碼:

@Entity
@Data
@Table(name = "Raffle")
public class Raffle{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long raffleID;

    private Timestamp startDate;
    private Timestamp endDate;
    private String winningNumbers;

    @OneToMany(mappedBy = "Tickets")
    private Set<Tickets> tickets;

    public Raffle(Timestamp startDate, Timestamp endDate, String winningNumbers,  Tickets... ticket){
        this.startDate = startDate;
        this.endDate = endDate;
        this.winningNumbers = winningNumbers;
    }
}

@Entity
@Data
@Table(name = "Tickets")
public class Tickets {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long TicketID;

    @ManyToOne
    @JoinColumn(name="RAFFLE_ID")
    private Raffle RaffleID;

    private String customerName;
    private String numbers;

}

@Entity
@Data
@Table(name = "Winners")
public class Winners {

    @Id
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "raffleID", referencedColumnName = "raffleID")
    private Raffle raffle;

    @Id
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "ticketID", referencedColumnName = "ticketID")
    private Tickets ticket;

    private Double prizeWon;
    private String prizeType;
    private String status;
}

目前我被拋出這個錯誤:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.grmkris.lightningloterry.model.database.Tickets.Tickets in com.grmkris.lightningloterry.model.database.Raffle.tickets

我知道我應該對 JPA 機制進行更多的自我教育……但到目前為止,通過谷歌搜索我還沒有發現我面臨的完全相同的問題。 因此,我也將感謝您可以向我推薦有關此主題的任何資源!

親切的問候

編輯:在發布這個之后,我發現了這個問題: 2 Foreign Keys Into a New Table from Different Entities Hibernate它建議使用association table 有沒有更簡單的方法來做到這一點?

我決定暫時關閉 flyway,只使用 spring 數據 jpa。 我設法解決了所有問題。 現在有 2 個外鍵的表可以工作了。 我使用@OneToOne 注釋,因為 1 張票我們只能贏一次。 但是在抽獎中使用了@ManyToOne,因為抽獎中可以有多個獲勝者。 如果我錯了,請糾正我。
我仍然希望能夠使用 flyway,但 hibernate 會生成自己的類,這些類很難手動使用 sql 進行復制。

@Entity 
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Raffle{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long raffleID;

    private Timestamp startDate;
    private Timestamp endDate;
    private String winningNumbers;

    @OneToMany(mappedBy = "raffle")
    private Set<Tickets> tickets;

    @OneToMany(mappedBy="raffle")
    private Set<Winners> winner;
}

@Entity
@Data
@Builder
@Table(name = "Tickets")
public class Tickets {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long ticketID;

    @ManyToOne
    @JoinColumn(name="raffleID", nullable=false)
    private Raffle raffle;

    private String customerName;
    private String customerEmail;
    private String customerDescription;
    private Integer[] numbers;
    private String status;

    @OneToMany(mappedBy="ticket")
    private Set<Winners> winner;

}


@Entity
@Data
@Table(name = "Winners")
public class Winners {

    @EmbeddedId private WinnersID id;

    @ManyToOne @MapsId("raffleID")
    private Raffle raffle;

    @OneToOne @MapsId("ticketID")
    private Tickets ticket;

    private Double prizeWon;
    private String prizeType;
    private String status;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM