一尘不染

JPA 2.0多列对多列

hibernate

我正在尝试在JPA 2.0(JBoss 7.1.1)中建立一个ManyToMany关系,并在该关系中增加一列(下面的粗体字),例如:

Employer           EmployerDeliveryAgent             DeliveryAgent
(id,...)   (employer_id, deliveryAgent_id, **ref**)  (id,...)

我不想有重复的属性,因此我想应用http://giannigar.wordpress.com/2009/09/04/mapping-a-many-to-
many-join-table中提供的第二种解决方案与额外的列一起使用jpa
/
。但是我无法正常工作,但出现了一些错误,例如:

  1. 嵌入式ID类不应包含关系映射(实际上,规范中是如此);
  2. 在属性“ employerDeliveryAgent”中,“映射人”值“ pk.deliveryAgent”无法解析为目标实体上的属性;
  3. 在属性“ employerDeliveryAgent”中,“映射人”值“ pk.employer”无法解析为目标实体上的属性。
  4. 无法解析替代属性“ pk.deliveryAgent”的持久类型;
  5. 持久属性的替代属性“ pk.employer”无法解析;

该链接上的许多人说它工作正常,所以我认为我的环境中有些不同,也许是JPA或Hibernate版本。所以我的问题是:如何使用JPA 2.0(Jboss
7.1.1 /使用Hibernate作为JPA实现)实现这种情况?并补充这个问题:我应该避免使用组合键,而是使用普通生成的ID和唯一约束吗?

提前致谢。

观察:我没有在这里复制源代码,因为它本质上是上面链接中的源代码的副本,只是具有不同的类和属性名称,因此我认为没有必要。


阅读 276

收藏
2020-06-20

共1个答案

一尘不染

首先,您需要生成一个EmployerDeliveryAgentPK类,因为它具有多个PK:

@Embeddable
public class EmployerDeliveryAgentPK implements Serializable {

    @Column(name = "EMPLOYER_ID")
    private Long employer_id;

    @Column(name = "DELIVERY_AGENT_ID")
    private Long deliveryAgent_id;
}

接下来,您需要创建一个EmployerDeliveryAgent类。这个类代表的关系,多对多之间EmployerDeliveryAgent

@Entity
@Table(name = "EmployerDeliveryAgent")
public class EmployerDeliveryAgent implements Serializable {

    @EmbeddedId
    private EmployerDeliveryAgentPK id;

    @ManyToOne
    @MapsId("employer_id") //This is the name of attr in EmployerDeliveryAgentPK class
    @JoinColumn(name = "EMPLOYER_ID")
    private Employer employer;

    @ManyToOne
    @MapsId("deliveryAgent_id")
    @JoinColumn(name = "DELIVERY_AGENT_ID")
    private DeliveryAgent deliveryAgent;    
}

之后,在Employer课堂上,您需要添加:

    @OneToMany(mappedBy = "deliveryAgent")
    private Set<EmployerDeliveryAgent> employerDeliveryAgent = new HashSet<EmployerDeliveryAgent>();

DeliveryAgent课堂上,您需要添加:

    @OneToMany(mappedBy = "employer")
    private Set<EmployerDeliveryAgent> employer = new HashSet<EmployerDeliveryAgent>();

这就是全部!祝好运!!

2020-06-20