当前位置: 首页 > 知识库问答 >
问题:

一对多关系中FKs引用的JPA复合PK

萧宏远
2023-03-14

我正在尝试将下表映射到JPA中。user_tax和税收以及user_tax和用户之间的关系是一对多的。它使我感到困惑,因为我有一个复合主键,我需要将外键映射到这2个键。

错误消息:< code > org . hibernate . annotation exception:mapped by引用未知的目标实体属性:entity。实体中的Tax.user_tax。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个答案

池赞
2023-03-14

我将在这里发布经过3天研究后对我有效的信息。

布赖恩·沃斯伯格正确地发布了用户税务类:

 @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;

    ...
}

然而,我得到了错误消息,我的代码没有编译。然后我还必须编辑用户和税务类:

 @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://vlamihalcea . com/the-best-way-to-map-a-many-to-many-association-with-extra-columns-when-using-JPA-and-hibernate/

谭桐
2023-03-14

您的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;

    ...
}

派生标识在第2.4.1节的JPA 2.2规范中进行了讨论(带有示例)。

 类似资料:
  • 我用复合键定义了两个实体之间的多对多关系。问题是,当我获得join对象时,它只被过滤了关系的一侧,而不是两边。 图片使问题更加清晰。这里,我要查找的是dtid=185和prid=352,但我从多对多关系中得到的是两个突出显示的行。 天丁:

  • 问题内容: 我想在两个实体(消费者和政策)之间建立一对多关系。一个消费者应该有几项政策。 这是我希望拥有的Consumer JSON对象的示例: 这是我到目前为止所拥有的: 政策实体 消费者实体 我认为这并不难,但是我现在尝试了几个小时而无法完成。我是Spring的新手,所以如果有人能够帮助我,我将非常感激! 问题答案: @Entity public class Consumer { 不是必需的,

  • 问题内容: 也许这是一个愚蠢的问题,但这困扰了我。 我有一个从员工到车辆的双向一对多关系。当我第一次将Employee保留在数据库中时(即它没有分配的ID),我也希望保留其关联的Vehicles。 目前,这对我来说很好,除了我保存的Vehicle实体没有自动映射关联的Employee,并且在数据库中Vehicle表中的employee_id外键列为空。 我的问题是,是否可以在雇员本身被保留的同时保

  • 我希望在消费者和政策这两个实体之间建立一对多关系。一个消费者应该有几个政策。 这是我想要的一个消费JSON对象的例子: 这就是我到目前为止所做的: 政策实体 消费者实体 我想没那么难,但我已经试了几个小时了,还是做不到。我刚到Spring,所以如果有人能帮助我,我会非常感激!

  • 我正在尝试使用Hibernate/Jpa建立一对多关系。 当前我遇到以下异常: 退款交易。java这是父类 ItemRefundDetail.java这是子类。 我知道我在@OneToMany或@manytone注释中犯了一些错误。 更新:我在db、refund_transaction和item_refund_detail中只有2个表。我没有任何名为refund_transaction_item_