У меня есть такой сценарий:
tbl_master(
master_field_pk int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`master_field_pk`)
)
и
tbl_detail(
`detail_field_pk` int(11) NOT NULL AUTO_INCREMENT,
`master_field_pk` int(11) DEFAULT NULL,
CONSTRAINT `child_fk1` FOREIGN KEY (`master_field_pk`) REFERENCES `tbl_master` (`master_field_pk`) ON DELETE NO ACTION ON UPDATE NO ACTION,
PRIMARY KEY (`master_field_pk`)
)
Это мой спящий класс для мастера:
@Entity
@Table(name = "tbl_master")
@Name("TblMaster")
public class TblMaster implements Serializable{
@Id
@Column(name = "master_field_pk")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer MasterFieldPk;
@Cascade({CascadeType.ALL,CascadeType.DELETE_ORPHAN})
@OneToMany(mappedBy="tblMaster")
@JoinColumn(name="master_field_pk", insertable=true, updatable=true, referencedColumnName="master_field_pk")
private Set<TblDetail> tblDetails;
@Transient
private List<TblDetail> tblDetailsList;
// any other things
}
, и это для деталей:
@Entity
@Table(name="tbl_detail")
@Name("TblDetail")
public class TblDetail implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="detail_field_pk")
private Integer detailFieldPk;
@Column(name="master_field_pk")
private Integer MasterFieldPk;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="master_field_pk", insertable = false, updatable = false, referencedColumnName = "master_field_pk")
private TblMaster tblMaster;
// any other things
}
Чтобы вставить, я использую этот блок кода (более или менее):
TblDetail detail_1 = ...
detail_1.setTblMaster(tblMaster);
// and so on ..
Set<TblDetails> set = ...
set.add(detail_1);
// and so on...
tblMaster.setTblDetails(set);
em.persist(tblMaster);
em.flush();
Все записи (основная запись и запись сведений) идеально вставлены.Тем не менее, master_field_pk
в tbl_detail
- внешний ключ - все еще нулевой.Можно ли избежать такого поведения?Спасибо