giu*_*ius 5 annotations hibernate jpa
我有这个db模式:
Table_A [1] - > [n] Table_C和Table_B [1] - > [n] Table_C
现在,Table_C的PrimaryKey是具有外键的EmbeddedId,而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;
}
Run Code Online (Sandbox Code Playgroud)
当您遵循JPA规范时,您会注意到不需要映射tableC.你可以使用连接表
像这样的东西
@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;
}
Run Code Online (Sandbox Code Playgroud)
如果要在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,...
}
Run Code Online (Sandbox Code Playgroud)
通过使对象可插入/可更新为false,您可以多次映射相同的属性.id中的其他属性是offcourse不可更新的,因为你会打破你的PK.
| 归档时间: |
|
| 查看次数: |
6037 次 |
| 最近记录: |