2016-09-30 28 views
0

コードとdbテーブル内のすべてがOKであるものの、私のエンティティを保存するタイトルに記載された問題に直面しました。ここ
は私のコードです:ここではフィールド 'accreditation_company_id'にデフォルト値のエラーがありません

@Entity 
public class Company { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id; 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumn(name = "company_id", referencedColumnName = "id") 
    List<CompanyObject> companyObjects; 
} 


@Entity 
public class CompanyObject { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id; 

    @Enumerated(EnumType.STRING) 
    ObjectType type; 
} 

は、私のテーブル定義である:

カンパニー(ID = 32、companyObjects:私は保存しようとしている

CREATE TABLE `company` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 

CREATE TABLE `company_object` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `company_id` bigint(20) NOT NULL, 
    `type` varchar(50) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK__company` (`company_id`), 
    CONSTRAINT `FK__company` FOREIGN KEY (`company_id`) REFERENCES `company` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

オブジェクトには、以下の情報が含まれています= [CompanyObject(id = null、type = NEW)])

ここにオブジェクトを保存するコードを示します。

コントローラ方法:

@RequestMapping(value = "/company/{id}", method = RequestMethod.POST) 
public String editCompany(@PathVariable("id") long companyId, 
          @ModelAttribute("form") CompanyDto form) { 
    Company company = companyService.getCompanyById(companyId); 
    companyService.updateCompany(company, form); 
    return "redirect:/companies"; 
} 

サービス方法:

@Transactional 
    public Company updateCompany(Company company, final CompanyDto form) { 
     company.getCompanyObjects().clear(); 
     company.getCompanyObjects().addAll(form.getCompanyObjects()); 
     return companyRepository.save(company); 
    } 

私は、これらのオブジェクト内のすべての欠落しているIDを生成し、移入、自動的に休止状態この権利を取得していますか?はいの場合は何が欠けていますか?エラーが表示される理由は?

+0

これらのオブジェクトをどのように保存していますか?いくつかのコードを見せてください。 – nagyf

+0

@ nagyf、私はいくつかのコードで答えを更新します。コメントありがとう! –

答えて

1

ここにいくつか問題があります。まず、テーブルの定義が間違っていて、accreditation_objectテーブルを確認してください。存在しないカラムを参照する外部キーがあります。company_idaccreditation_company_idです。 (?またはそれは単にいくつかのコピー&ペーストの誤差である)

第二に、あなたのエンティティが間違っている、この方法を試してみてください。

@Entity 
public class Company { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id; 

    @OneToMany(mappedBy="company", cascade = CascadeType.ALL) 
    Set<CompanyObject> companyObjects; 
} 


@Entity 
public class CompanyObject { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id; 

    @Enumerated(EnumType.STRING) 
    ObjectType type; 

    @ManyToOne 
    @JoinColumn(name = "company_id") 
    Company company; 
} 

CompanyObjectで@ManyToOne注釈に注意してください。私が正しく理解していれば、会社に1つ以上のCompanyObjectを割り当てたいので、にの注釈付きCompany型フィールドを付ける必要があります。今

、あなたは、CompanyObject秒のリストを反復処理する以前に保存された会社のインスタンスを設定し、CompanyObject Sを保存し、Companyインスタンスを保存する最初の、これらのオブジェクトを保存したい場合は、このような何か:

Company company = new Company(); 
companyDao.persist(company); 

List<CompanyObject> companyObjects = new ArrayList<>(); 
// populate the list somehow 
// ... 

for(CompanyObject obj: companyObjects){ 
    obj.setCompany(company); 
    companyObjectDao.persist(obj); 
} 

あなたのupdateCompanyメソッドが間違っているので、上記のコードのようなものを試してください。 (。何かがCompanyDTOは何が欠けているように見えるので、私はあなたの例を書き換えることができない?)

編集:あなたが(注:私はCompanyエンティティを更新しました)保存カスケードを使用することができ、ちょうど設定してくださいすべてのCompanyObjectインスタンスへCompanyインスタンスは、同じよう:

@Transactional 
public Company updateCompany(Company company, final CompanyDto form) { 
    company.getCompanyObjects().clear(); 
    company.getCompanyObjects().addAll(form.getCompanyObjects()); 
    for(CompanyObject obj : company.getCompanyObjects()){ 
     obj.setCompany(company); 
    } 
    return companyRepository.save(company); 
} 

私は、これは動作するはずだと思うが、私は100%確実ではないです。試してみる。

+0

ありがとうございます@ nagyf、私はそれを試してみましょう。命名法が混乱しているのは間違いないと思いますが、これは単なるコピーペーストミスです。オブジェクトの構造を残しておくことができるかどうか疑問に思います。 'cascade'プロパティは子の保存のために設計されていませんか? –

+0

私は答えを更新しました – nagyf

+0

ありがとう、@ nagyf、それは働いた、あなたは命の恩人です! –

関連する問題