Hibernate JPA 注解:嵌入式 ID 出现问题

5

我有一个数据库架构:

Table_A[1]-->[n]Table_C 和 Table_B[1]-->[n]Table_C

现在,Table_C的主键是一个嵌入式ID,包含对Table_A和Table_B的外键。如何注释这个?

我的解决方案是:

@Entity
public class TableA{
    @Id @column(name="ID")
    public int id;

    @OneToMany(mappedBy="tableA")
    public List<TableC> listOftableC; 
}

@Entity
public class TableB{
    @Id @column(name="ID")
    public String id;

    @OneToMany(mappedBy="tableB")
    public List<TableC> listOftableC; 

}

@Entity
public class TableC{
    @EmbeddedId
    public TableCPK idComposite;
}

@Embeddable
public class TableCPK{

    @ManyToOne
    @JoinColumn(name = "ID_TABLE_A", referencedColumnName="ID")
    public TableA tableA;

    @ManyToOne
    @JoinColumn(name = "ID_TABLE_B", referencedColumnName="ID")
    public TableA tableB;
}

关系必须是双向的。 - giulius
1个回答

5
当你遵循JPA规范时,你会发现没有必要映射tableC。你可以使用jointable,像这样:
@Entity
public class TableA{
    @Id
    @column(name="ID")
    public int id;
    @ManyToMany
    @JoinTable(name="TableC",
            joinColumns = {@JoinColumn(name = "ID_TABLE_A", referencedColumnName="ID")},
            inverseJoinColumns = {@JoinColumn(name = "ID_TABLE_B", referencedColumnName="ID")
    })
    public List<TableB> listOftableB;
}
@Entity 
public class TableB{
     @Id @column(name="ID")
     public String id;
     @OneToMany(mappedBy="listOftableB")
     public List<TableA> listOftableA;
}

如果您想在JoinTable中映射某些内容,也可以将其定义为实体。您可以像这样映射tableC:

@Entity
public class TableC{
    @EmbeddedId
    private MyId id;
    @ManyToOne
    @JoinColumn(name = "ID_TABLE_A", insertable = false, updatable = false)
    private TableB tableA;
    @ManyToOne
    @JoinColumn(name = "ID_TABLE_B", insertable = false, updatable = false)
    private TableB tableB;

    @Column(name="extra_field")
    private String extraField;
}

@Embeddable
public class MyId{
    @Column(name="ID_TABLE_A")
    private int idTableA;
    @Column(name="ID_TABLE_B")
    private int idTableB;
    // equals, hascode,...
}

通过将对象的insertable/updatable属性设置为false,您可以多次映射相同的属性。id中的其他属性当然是不可更新的,因为这会破坏您的主键。

如果表C有其他需要映射的属性,我该如何映射它们? - giulius
我的先前答案并没有直接回答你的问题,我已经扩展了它。 - jelle
你有一个解决方案来回答我的问题吗? - giulius
抱歉,我没有看到更正。请尝试这个解决方案。谢谢。 - giulius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接