дизайн весны данных JPA аннотированный класс с 2 внешними ключами - PullRequest
0 голосов
/ 24 января 2020

Итак, для упражнения я создаю Java веб-приложение с использованием Spring. Это простой API лотереи.

Я решил использовать JPA данных пружины в этом проекте, и я совершенно новичок ie в доступе к базе данных на основе ORM.
Я также использую flyway для управления версиями данных. Поэтому я генерирую БД, используя сценарии flyway, а затем проверяю его по моим весенним данным 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? Можно ли было создать ПФК? Я использую 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 .. Но до сих пор с поиском в Google я не нашел точно такой же проблемы, с которой я сталкиваюсь. Поэтому я также буду признателен за любой ресурс, который вы можете порекомендовать мне на этом топи c!

С уважением

РЕДАКТИРОВАТЬ: сразу после публикации я нашел этот вопрос: 2 Foreign Keys В новую таблицу из разных сущностей Hibernate Рекомендуется использовать association table. Есть ли более простой способ сделать это?

1 Ответ

0 голосов
/ 25 января 2020

Я решил пока отключить пролет и просто использовать данные весны jpa. Мне удалось исправить все проблемы. Теперь таблица с 2 внешними ключами работает. Я использую аннотацию @OneToOne, потому что 1 билет мы можем выиграть только один раз. Но использовали @ManyToOne с Raffle, потому что в лотерее может быть несколько победителей. Пожалуйста, исправьте меня, если я ошибаюсь.
Я все еще хотел бы иметь возможность использовать 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...