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

嵌套n: m属性JPA

左丘修齐
2023-03-14

我在一个项目中有一个奇怪的需求。加入两个n: m属性表(我将用虚拟属性呈现行为)。

  1. 第一表(idPlace、idAddress、idSchool、wage)加入1:m

当然,我有表地方,地址,学校,企业与他们各自的ID,获取,集合和属性在实体类中实现。

代码:

位置

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

第一桌

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

上面提到的表和联接工作得很好。现在我想把第一个表和第二个表连接起来。

企业号

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

现在,对于第二个表,我遵循了相同的逻辑来连接到企业。对于与第一个表的连接,我尝试了以下方法:

@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{}

我的注释中有些东西不起作用,我试图做一个inverseJoin到FirstTable表。编译显示此错误:

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

我试图提供一个MV示例。提前谢谢,我真的需要你的帮助。

共有1个答案

淳于飞文
2023-03-14

几个小时后,经过多次尝试,我才设法解决了这个问题。事实上,解决方案比我最初想的要简单得多。

这是:

 @AssociationOverride(name = "pk.firstTable", joinColumns = {
            @JoinColumn(name = "idSchool"),
            @JoinColumn(name = "idAddress"),
            @JoinColumn(name = "idPlace") }),
    @AssociationOverride(name = "pk.enterprise", joinColumns = @JoinColumn(name = "idEnterprise")) })
 类似资料:
  • 问题内容: swift没有嵌套类吗? 例如,我似乎无法从嵌套类访问主类的属性测试。 问题答案: Swift的嵌套类与Java的嵌套类不同。好吧,它们就像是Java的一种嵌套类,而不是您正在考虑的那种。 在Java中,内部类的实例会自动引用外部类的实例(除非声明了内部类)。如果您有外部类的实例,则只能创建内部类的实例。这就是在Java中您说类似的原因。 在Swift中,内部类的实例独立于外部类的任何

  • 我有这门课: ContractDetail类如下所示:

  • 我试图提供一种方法,在一个模型中生成一个新对象(列表),在另一个模型中使用has_many关系(通过分组)生成一个新的关联对象(项目)。我能够让表单工作正常,但无法弄清楚为了正确完成创建过程,我缺少什么。 Rails v.5.1.2,Ruby v.2.4.1 lists_controller.rb items_controller.rb list.rb模型 item.rb模型 grouping.r

  • 我有以下build.xml代码。在这里,我在jar文件中修改了清单文件。在清单中,我想添加一些属性,例如资产名称和资产基线。 buildInfo的内容。属性如下: build.xml:我想动态传递名称,即 articlelib 值,并从 buildInfo.properties 中检索值。我在清单外部使用了宏元数据,它是工作文件,但当我在清单标签中使用相同的时,我无法使用它。我是否可以解决此问题或

  • 我正在尝试反序列化一个 JSON 响应,其中包含一些标准字段和一个包含子类属性的 嵌套对象,例如: 字段< code>id和< code>type是标准的,所以我有一个基类< code>Base,然后扩展一些更具体的类: 如何让杰克逊读取 对象作为进一步字段值的来源?我假设我需要创建一个自定义反序列化程序,但我不确定如何具体完成此操作。

  • 描述 (Description) 您可以通过使用“。”连接访问路径的属性名来访问bean的嵌套属性的值。 分隔符。 您可以使用以下方法获取和设置Nested属性的值: PropertyUtils.getNestedProperty(Object, String) PropertyUtils.setNestedProperty(Object, String, Object) 参数: Object :