JPA Composite PK упоминается ФК в отношениях один ко многим - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь отобразить таблицы ниже в JPA. Отношения один-ко-многим между user_tax и налогом и user_tax и user . Меня смущает тот факт, что у меня есть составной первичный ключ, и мне нужно сопоставить внешние ключи с этими двумя ключами.

сообщение об ошибке: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: entity.Tax.user_tax in entity.UserTax.taxs

             tax           user_tax         user
           --------        --------        ------
         PK|t_id  |--------| t_id |PK-FK  |u_name|
           |t_name|   PK-FK| u_id |-------|u_id  | PK
           |      |        | name |       |      |

Вот мои сущности:

 @Entity
 @Table(name = "user")
 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    public class User implements Serializable {

       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
         private Long id;

       @Column(name="u_name")
         private String uname;

          getters + setters
        }

 @Entity
 @Table(name = "tax")
 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    public class Tax implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;

        @Column(name = "t_name")
          private String tname;

   @Embeddable
    public class UserTaxId implements Serializable {

      @Column(name="u_id")
        private Long uId;

        @Column(name="t_id")
        private Long tId;

  @Entity
  @Table(name = "user_tax")
  @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    public class UserTax implements Serializable {

      @EmbeddedId
        private UserTaxId userTaxId;

      @OneToMany(fetch = FetchType.LAZY, mappedBy = "user_tax")
        private List<User> users;

      @OneToMany(fetch = FetchType.LAZY, mappedBy = "user_tax")
        private List<Tax> taxs;

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Я опубликую здесь, что сработало для меня после 3 дней исследований.

Брайан Восбург правильно разместил класс UserTax:

 @Entity
@Table(name = "user_tax")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class UserTax implements Serializable {

    @EmbeddedId
    private UserTaxId userTaxId;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("uId") // maps uId attribute of embedded id
    private User user;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("tId") // maps tId attribute of embedded id
    private Tax tax;

    ...
}

Однако я получал сообщения об ошибках и мой код не компилируется. Затем мне также пришлось отредактировать классы User и Tax:

 @Entity
     @Table(name = "user")
     @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
        public class User implements Serializable {

           @Id
           @GeneratedValue(strategy = GenerationType.IDENTITY)
             private Long id;

           @OneToMany(
            mappedBy = "tid",
            cascade = CascadeType.ALL,
            orphanRemoval = true
        )
        private List<UserTax> tax = new ArrayList<>();

           @Column(name="u_name")
             private String uname;

              getters + setters
            }

    @Entity
     @Table(name = "tax")
     @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
        public class Tax implements Serializable {

            @Id
            @GeneratedValue(strategy = GenerationType.IDENTITY)
              private Long id;

           @OneToMany(
            mappedBy = "uid",
            cascade = CascadeType.ALL,
            orphanRemoval = true
        )
        private List<UserTax> taxs = new ArrayList<>();

            @Column(name = "t_name")
              private String tname;

    setters+getters

    }

Вот ссылка, по которой я нашел решение своей проблемы: https://vladmihalcea.com/the-best-way-to-map-a-many-to-many-association-with-extra-columns-when-using-jpa-and-hibernate/

0 голосов
/ 08 февраля 2020

Ваши отображения 1: n обратные (т. Е. UserTax может иметь только один User и один Tax), и вы используете производную идентификацию. Попробуйте сопоставить UserTax следующим образом:

@Entity
@Table(name = "user_tax")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class UserTax implements Serializable {

    @EmbeddedId
    private UserTaxId userTaxId;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("uId") // maps uId attribute of embedded id
    private User user;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("tId") // maps tId attribute of embedded id
    private Tax tax;

    ...
}

Производные идентификаторы обсуждаются (с примерами) в JPA 2.2 spe c в разделе 2.4.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...