1

以下の2つのクラスに記載されているように、1対多の関係があります

    @Entity
    @Table(name="version_mst")
    public class Version {

    private Long   id;
    private String versionName;
    private String releaseName;
    private Set<VersionReleaseComponents> versionReleaseComponents; 

    @Id
    @GeneratedValue
    @Column(name="id")
    public Long  getId() {
        return id;
    }
    public void setId(Long  id) {
        this.id = id;
    }

    @Column(name="versionName")
    public String getVersionName() {
        return versionName;
    }
    public void setVersionName(String versionName) {
        this.versionName = versionName;
    }

    @Column(name="releaseName")
    public String getReleaseName() {
        return releaseName;
    }
    public void setReleaseName(String releaseName) {
        this.releaseName = releaseName;
    }

    @OneToMany(mappedBy="version",cascade = { javax.persistence.CascadeType.ALL },fetch = FetchType.EAGER,targetEntity=VersionReleaseComponents.class)
    public Set<VersionReleaseComponents> getVersionReleaseComponents() {
        return versionReleaseComponents;
    }
    public void setVersionReleaseComponents(
            Set<VersionReleaseComponents> versionReleaseComponents) {
        this.versionReleaseComponents = versionReleaseComponents;
    }

      }       

1 つのバージョンには多くの VersionReleaseComponent があります

     @Entity
     @Table(name="version_release_components")
     public class VersionReleaseComponents {

    private Long id;

    @Id
    @GeneratedValue
    @Column(name="id")
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "versionId")
    private Long versionId;
    public Long getVersionId() {
        return versionId;
    }
    public void setVersionId(Long versionId) {
        this.versionId = versionId;
    }
    private Version version;
    private String componentName;
    private String versionNumber;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="versionId", referencedColumnName="id", insertable = false, updatable = false)
    public Version getVersion() {
        return version;
    }
    public void setVersion(Version version) {
        this.version = version;
    }

    @Column(name="componentName")
    public String getComponentName() {
        return componentName;
    }
    public void setComponentName(String componentName) {
        this.componentName = componentName;
    }

    @Column(name="versionNumber")
    public String getVersionNumber() {
        return versionNumber;
    }
    public void setVersionNumber(String versionNumber) {
        this.versionNumber = versionNumber;
    }

        }     

次を実行しようとすると

        Version v = new Version();
        v.setReleaseName("RN1");
        v.setVersionName("VName1");

        VersionReleaseComponents vrc = new VersionReleaseComponents();
        vrc.setComponentName("cn1");
        vrc.setVersionNumber("VNum1");
        vrc.setVersion(v);

        v.getVersionReleaseComponents().add(vrc); // null pointer error on here
        session.saveOrUpdate(v);

セットを取得する際にヌル ポインター例外が発生します。ガイドしてください。

クエリの作成は次のとおりです

      CREATE TABLE `version_mst` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `versionName` varchar(20) NOT NULL,
      `releaseName` varchar(20) NOT NULL,
      `last_modified_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`ID`),
      UNIQUE KEY `VERSION_MAPPING_MST_UNIQUE` (`versionName`,`releaseName`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    CREATE TABLE `version_release_components` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `versionId` int(10) NOT NULL ,
      `componentName` varchar(20) NOT NULL,
      `versionNumber` varchar(20) NOT NULL,
      `last_modified_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`ID`),
      CONSTRAINT `FK_VERSION` FOREIGN KEY (`versionId`) REFERENCES `version_mst` (`id`),
      UNIQUE KEY `VERSION_RELEASE_UNIQUE` (`componentName`,`versionNumber`)
    ) ENGINE=InnoDB   DEFAULT CHARSET=latin1;
4

5 に答える 5

2

インスタンスVersion化していない場合:

private Set<VersionReleaseComponents> versionReleaseComponents; 

したがって、初期化されていないものに追加VersionReleaseComponentsしていますSet

修正するには、次のように設定します。

private Set<VersionReleaseComponents> versionReleaseComponents = new HashSet<VersionReleaseComponents>(); 

またはSetあなたが必要とするものは何でも

于 2012-12-13T15:00:16.600 に答える
0

SetにNULLのアイテムを追加しようとしていると思います。

これを試して :

    Version v = new Version();
    v.setReleaseName("RN1");
    v.setVersionName("VName1");

    VersionReleaseComponents vrc = new VersionReleaseComponents();
    vrc.setComponentName("cn1");
    vrc.setVersionNumber("VNum1");
    vrc.setVersion(v);

    Set<VersionReleaseComponents> vrcs = new HashSet<VersionReleaseComponents>();
    vrcs.add(vrc);
    v.setVersionReleaseComponents(vrcs);

    session.saveOrUpdate(v);
于 2013-01-15T14:02:22.280 に答える
0

以下を変更: VersionReleaseComponents の宣言を削除

     @Column(name = "versionId")
    private Long versionId;
    public Long getVersionId() {
        return versionId;
    }
    public void setVersionId(Long versionId) {
        this.versionId = versionId;
    }

VersionReleaseComponents 宣言を

 @JoinColumn(name="versionId")

バージョン宣言は

@OneToMany(mappedBy="id",cascade = { javax.persistence.CascadeType.ALL },fetch =  FetchType.LAZY)

上記の変更は機能しました。解決策の一部ではありませんが、他の理由で FetchType.LAZY に変更しました。

于 2012-12-14T06:42:21.890 に答える
0

交換してみる

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="versionId", referencedColumnName="id", insertable = false, updatable = false)
public Version getVersion() {
  return version;
}

このため:

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="versionReleaseComponents")
   public Version getVersion() {
      return version;
    }

@ user1393563 の推奨事項を使用します。

private Set<VersionReleaseComponents> versionReleaseComponents = new HashSet<VersionReleaseComponents>();

よろしく。

于 2012-12-13T15:29:46.160 に答える