具有复合键的树数据

时间:2018-07-04 14:37:57

标签: java hibernate jpa

我有一个无法解决的问题。我准备了一个示例来说明它。

让我们保留飞船中的士兵人数。每个飞船中都有一些士兵。每个士兵在星际飞船中都有一个唯一的个人号码。每个士兵都有一个高级官员,他也是一个士兵,也有一个高级官员,依此类推。我们还有其他有关部队的信息,这无关紧要,因此我们只添加一个“信息”字段。 所以:

create table starship(
  id bigint primary key,
  name varchar(100)
)

create table trooper(
  personal_number int not null,
  starship bigint not null reference starship (id),
  info varchar(1000),
  commander int,
  primary key(personal_number, starship),
  foreign key(commander, starship) reference trooper(personal_number, starship)
)

我们有两个桌子。带有星舰名称和ID的“星舰”,以及“骑兵”,其中有骑兵个人号码,他的星舰号,信息和他的司令员个人号码。 我需要对这些数据进行CRUD操作,但是我无法构建适当的实体。问题是关于写“指挥官”数据。

我正试图通过这种方式。

星际飞船:

@Entity(name = "starship")
public class Starship (
  @Id
  @Column(name = "id", unique = true)
  private Long id;

  @Column(name = "name")
  private String name;
)

部队:

@Entity(name = "trooper")
public class Trooper {

  @EmbeddedId
  private TrooperKey id;

  @Column(name = "info")
  private String info;

  @ManyToOne
  @MapsId(value = "type")
  @JoinColumns({
        @JoinColumn(name = "parent", referencedColumnName = "portal_id"),
        @JoinColumn(name = "type", referencedColumnName = "type")
  })
  @NotFound(action = NotFoundAction.IGNORE)
  private Trooper commander;

  @OneToMany(mappedBy = "commander", cascade = CascadeType.ALL, orphanRemoval = true)
  @LazyCollection(LazyCollectionOption.FALSE)
  private Set<Trooper> subitems = new HashSet<>();

}

士兵键:

@Embeddable
public class TrooperKey implements Serializable {

  @Column(name = "personal_number")
  private Long personalNumber;

  @ManyToOne()
  @JoinColumn(name = "starship")
  private Starship starship;

}

我正在尝试使用@MapsId,因为否则我需要将此联接标记为insertable = false, updatable = false。但是它仍然没有将指挥官编号保存在数据库的commander字段中。

0 个答案:

没有答案