2

データベースに 2 つのテーブルがあります。複数のビルドを持つことができるプロジェクトがあります。1 つのビルドは 1 つのプロジェクトに属します。ビルド テーブルの外部キーが null のままであることを除いて、すべて正常に動作します。

計画

@Entity(name="project")
public class Project implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "projectID")
private Long id;

@Column
@JsonProperty("displayName")
private String name;

@JsonProperty("builds")
@JsonIgnore
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = ("project"))
private Collection<Build> builds;

public Project() {
}

public Project(String name) {
    this.name = name;
}

public Collection<Build> getBuilds() {
    return builds;
}

public void setBuilds(Collection<Build> builds) {
    this.builds = builds;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this);
}
}

建てる

@Entity(name = "build")
public class Build implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column
@JsonProperty("number")
private Integer number;

@Column
@JsonProperty("url")
private String url;

@JsonBackReference
@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "project")
private Project project;

public Build() {
}

public Build(String url, Project project, Integer number) {
    this.url = url;
    this.project = project;
    this.number = number;
}

public Long getId() {
    return id;
}

public Integer getNumber() {
    return number;
}

public String getUrl() {
    return url;
}

public void setId(Long id) {
    this.id = id;
}

public void setNumber(Integer number) {
    this.number = number;
}

public void setUrl(String url) {
    this.url = url;
}

public Project getProject() {
    return project;
}

public void setProject(Project project) {
    this.project = project;
}
}

誰かが問題を見ていますか?

4

1 に答える 1

1

ProjectJPA を使用すると、オブジェクトで を明示的に定義する必要がありBuildます。

Project project = new Project();

Build build = new Build();
build.setProject(project);

project.setBuilds(Collections.singletonList(build));

// now you can persist it    
em.persist(project)

Hibernateのドキュメントから:

まず、Hibernate は通常の Java セマンティクスに影響を与えないことに注意してください。単方向の例で、Person と Event の間にどのようにリンクを作成したのでしょうか? Event のインスタンスを、Person のインスタンスのイベント参照のコレクションに追加します。このリンクを双方向にしたい場合は、Event のコレクションに Person 参照を追加して、反対側でも同じことを行う必要があります。この「両側にリンクを設定する」プロセスは、双方向リンクでは絶対に必要です。

于 2013-05-07T08:16:03.927 に答える