【问题标题】:Nested n:m + attributes JPA嵌套 n:m + 属性 JPA
【发布时间】:2017-04-19 21:38:48
【问题描述】:

我在一个项目中有一个奇怪的需求。加入两个 n:m+attributes 表(我将展示带有虚拟属性的行为)。

  1. FirstTable(idPlace、idAddress、idSchool、工资)于 1:m 加入;
  2. SecondTable(idPlace、idAddress、idSchool、qty、idEnterprise)

编辑(示例架构):

当然,我有表 Place、Address、School、Enterprise 以及它们各自在实体类中实现的 Id、gets、set 和属性。

代码:

地点

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

/**
 * 
 */
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idLine")
private Long idLine;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.place")
private List<FirstTable> firstTables;
}

地址

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

/**
 * 
 */
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idAddress")
private Long idAddress;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.address")
private List<FirstTable> firstTables;
}

学校

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

/**
 * 
 */
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idSchool")
private Long idSchool;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.school")
private List<FirstTable> firstTables;
}

FirstTable

@Entity
@Table(name = "FirstTable")
@AssociationOverrides({ @AssociationOverride(name = "pk.school", joinColumns = @JoinColumn(name = "idSchool")),
    @AssociationOverride(name = "pk.address", joinColumns = @JoinColumn(name = "idAddress")),
    @AssociationOverride(name = "pk.place", joinColumns = @JoinColumn(name = "idPlace")) })
public class FirstTable implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@EmbeddedId
protected FirstTablePK pk = new FirstTablePK();
 }

FirstTablePK

@Embeddable
public class FirstTablePK implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;
@ManyToOne
private Address address;
@ManyToOne 
private Place place;
@ManyToOne 
private School school;
}

上面提到的表和连接运行良好。现在我想加入 FirstTable 和 Second Table。

企业

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

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idEnterprise")
private Long idEnterprise;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.enterprise") 私有列表 secondTables; }

现在对于 SecondTable,我按照相同的逻辑连接到 Enterprise。为了与 FirstTable 连接,我试过这个:

@Entity
@Table(name = "SecondTable")
@AssociationOverrides({
        @AssociationOverride(name = "pk.firstTable", joinTable = @JoinTable(
                name = "FirstTable", inverseJoinColumns = {
                @JoinColumn(name = "idSchool", referencedColumnName = "idSchool"),
                @JoinColumn(name = "idAddress", referencedColumnName = "idAddress"),
                @JoinColumn(name = "idPlace", referencedColumnName = "idPlace") })),
        @AssociationOverride(name = "pk.enterprise", joinColumns = @JoinColumn(name = "idEnterprise")) })
public class SecondTable implements Serializable{}

我的注释中有些东西不起作用,我正在尝试对 FirstTable 表执行 inverseJoin。编译显示此错误:

"org.hibernate.AnnotationException: A component cannot hold properties split into 2 different tables"

我试图提供一个 MV 示例。 在此先感谢您,我真的需要您的帮助。

【问题讨论】:

    标签: java mysql hibernate jpa mapping


    【解决方案1】:

    在我设法解决问题之前,经过数小时和多次尝试。实际上,解决方案比我最初想的要简单得多。

    这里是:

     @AssociationOverride(name = "pk.firstTable", joinColumns = {
                @JoinColumn(name = "idSchool"),
                @JoinColumn(name = "idAddress"),
                @JoinColumn(name = "idPlace") }),
        @AssociationOverride(name = "pk.enterprise", joinColumns = @JoinColumn(name = "idEnterprise")) })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-08
      • 2021-05-01
      • 2010-11-10
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多