【发布时间】:2017-04-19 21:38:48
【问题描述】:
我在一个项目中有一个奇怪的需求。加入两个 n:m+attributes 表(我将展示带有虚拟属性的行为)。
- FirstTable(idPlace、idAddress、idSchool、工资)于 1:m 加入;
- 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