Отношение Мастер / Деталь с автоматическим приращением. Можно ли их сохранить сразу? - PullRequest
2 голосов
/ 17 марта 2011

У меня есть такой сценарий:

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 - внешний ключ - все еще нулевой.Можно ли избежать такого поведения?Спасибо

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Нет.Вы должны сохранить настойчивость мастера в первую очередь.Строки сведений должны знать, какой главный идентификатор должен быть связан.

Это можно сделать, но только когда ключ назначен приложением, например, ключи GUID, назначенные приложением, или какой-то ключсервер.

1 голос
/ 17 марта 2011

CascadeType.ALL должен помочь вам. Это работало для меня все время.

Я думаю, что ваша проблема заключается в вашей стратегии атрибутов @GeneratedValue. Вы должны использовать GenerationType.IDENTITY вместо GenerationType.AUTO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...