我有一个无法解决的问题。我准备了一个示例来说明它。
让我们保留飞船中的士兵人数。每个飞船中都有一些士兵。每个士兵在星际飞船中都有一个唯一的个人号码。每个士兵都有一个高级官员,他也是一个士兵,也有一个高级官员,依此类推。我们还有其他有关部队的信息,这无关紧要,因此我们只添加一个“信息”字段。 所以:
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
字段中。