2017-10-16 14 views
0

カスケードを持続させると例外がスローされます(MySQLIntegrityConstraintViolationException)。 私はSpring Data;を使用してデータを保持しています。キー 'PRIMARY'の重複するエンティティ

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 重複エントリー 'ブルームバーグ' キー 'PRIMARY' の

News.class:

@Entity 
public class News implements Serializable { 

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

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "company_name") 
    private Company company; 

    ... 
} 

Company.class:

@Entity 
@Table(name = "company") 
public class Company implements Serializable{ 

    @Id 
    @Column(unique = true,nullable = false) 
    private String name; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "company",fetch = FetchType.EAGER) 
    private List<News> newsList; 

    ... 
} 

私はこのコードを使用して永続化しています:

public void parseDB() throws IOException { 
    List<News> newsList = new ArrayList<>(); 

    Map<String, Company> companyMap = ((List<Company>) companyRepository.findAll()).stream().collect(Collectors.toMap(Company::getName, company -> company)); 

    newsList.addAll(WebPagesParser.parseCategory("...", "...", companyMap)); 
    newsList.forEach(newsService::create); 
    } 


public static List<News> parseCategory(String url, String category,Map<String,Company> companyMap) throws IOException { 
     ... 
     Company company; 
     if (companyMap.containsKey(name)) { 
        company = companyMap.get(name); 
       } else { 
        company = new Company(); 
        company.setName(top.get(1).text()); 
       } 
     news.setCompany(company); 
     ... 
     } 

そして、それは私に新しい例外を与えた

org.springframework.dao.InvalidDataAccessApiUsageException:独立した永続化するために渡さ エンティティ:com.example.inosmi.database.data.Newsを。永続化するために渡されたデタッチ エンティティ: ネストされた例外はorg.hibernate.PersistentObjectExceptionあるcom.example.inosmi.database.data.News

完了: は私の問題の半分を解決してきた、私はまだドン」それがどこにあるのか分かりませんが、それは働きます。みんな、ありがとう!

+0

すでにデータベースに存在する主キーを持つ行を挿入しようとしています。 –

+0

私はそれをマージしたいが、それはしなかった。 –

+1

あなたのマージ/永続化コードを使用している場合、あなたの質問を表示できますか? – LenglBoy

答えて

0

MySQLはここ

@Id 
@Column(unique = true, nullable = false) 
private String name; 

であり、あなたがロードしているデータが複数ありますが、同じ主キー

でこれが関連するコードを複数の行を挿入しようとしていることを語っています会社名の代わりに@OneToManyのためのリストのセットBloomberg

+0

私はそれを完全に理解しており、この企業のオブジェクトを1つのエンティティに統合することを望みます。 –

+0

次に、新しいオブジェクトを作成せずに、会社オブジェクトをロードしていることを確認します。 'News#setCompany'を呼び出すとき、引数はデータベースから既にロードしたものでなければなりません。新しい会社(...)で作成したものではありません – ptomli

+0

がチェックされています。 –

0

使用して行が他の1つのindex列を維持

@OneToMany(cascade = CascadeType.ALL, mappedBy = "company",fetch = FetchType.EAGER) 
private Set<News> newsList; 
+0

となっています。反応はありません –

関連する問題