Сохранение одного и того же объекта в разных таблицах (одна и та же схема) с использованием Jpa - PullRequest
0 голосов
/ 05 марта 2020

Я использую репозитории данных JPA для сохранения данных в своих таблицах.

В одной из ситуаций мне нужно хранить данные в двух разных таблицах. Эти две таблицы имеют одинаковую схему. Но я могу хранить только в одной таблице, поскольку JpaRepository сопоставляется только с одной таблицей.

Пример:

@Entity
@Table(name="users")
class User {
  private Long userId;
  private String firstName;
  private String lastName;
}

interface MyRepo1 extends JpaRepositories<User,Long> {
}

interface MyRepo2 extends JpaRepositories<User,Long> {
}

Есть ли способ сопоставить одну сущность с несколькими JpaRepositories? Поэтому, когда я вызываю MyRepo1.save (пользователь), он сохраняется в таблице «Пользователи», а когда я вызываю MyRepo2.save (пользователь), он сохраняет в таблице BackupUsers (точно такая же схема, что и у пользователей).

Спасибо

Ответы [ 2 ]

1 голос
/ 05 марта 2020

У вас должно быть две разные сущности, например, сущность AppUser сущности пользователя, каждая из которых указывает на разные таблицы, подобные этой, при условии, что имена этих двух таблиц users и app_users:

@Entity
@Table(name="users")
public class User extends SuperUser {...}

и

@Entity
@Table(name="app_users")
public class AppUser extends SuperClass {...}

Конечно, чтобы избежать дублирования кода, вы можете поместить поля таблицы в суперкласс с именем SuperClass, например:

    @Entity
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    public class SuperUser {
      @Id
      private Long userId;
      private String firstName;
      private String lastName;
      // getters and setters, constructors
    }

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

public interface UserRepository extends JpaRepositories<User, Long> {
}

public interface AppUserRepository extends JpaRepositories<AppUser,Long> {
}

ПРИМЕЧАНИЕ: В заключение sh вообще не рекомендуется иметь две таблицы с одинаковыми полями.

1 голос
/ 05 марта 2020

Я не думаю, что вы можете сохранить в разных таблицах с двумя разными репозиториями, потому что вы не можете указать имя таблицы в репозитории, но в сущности, я бы предложил использовать:

// class which hold common fields
class User {
  private Long userId;
  private String firstName;
  private String lastName;
}

// entity for table 1
@Entity
@Table(name="table1")
class User1 extends User {}

// entity for table 1
@Entity
@Table(name="table2")
class User2 extends User {}

// repo for entity 1
interface MyRepo1 extends JpaRepositories<User1,Long> {}

// repo for entity 2
interface MyRepo2 extends JpaRepositories<User2 ,Long> {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...