2016-09-08 19 views
0

このコードは、ActivityのHashSetを持つCompanyエンティティを保持します。JPA 2.1 Hibernate 1対多制約違反重複エントリ

em.getTransaction().begin(); 

// De Morgen. 
MediaGroup mediaGroupDM = new MediaGroup("De Persgroep", "Christian van Thillo", "Van Thillo Family"); 
HashSet<Activity> activities = new HashSet<>(); 
activities.add(new Activity("News paper")); 
activities.add(new Activity("News website")); 
activities.add(new Activity("Facebook opinion")); 
Company deMorgen = new Company("De Morgen", "http://www.demorgen.be/", mediaGroupDM, activities); 
em.persist(deMorgen); 

em.getTransaction().commit(); 

結果はデー​​タベースには問題ありません。新しいテーブル 'company_activities'が、会社のIDとアクティビティのID(下に示すように)で作成されます。

Result in the DB

しかし、私は同じ活動を持っている別の会社、この例外がスローされますを追加するとき: MySQLIntegrityConstraintViolationException:エントリ「3」キーの重複「UK_9j7c1qdg3rnhjioqut33ki7pr」私はそれは望んでいない理解

activities_id列で重複しますが、私が達成しようと、このです:

 
Company_id | activities_id 
-----------|-------------- 
1   | 3 
1   | 4 
1   | 5 
2   | 3 
2   | 4 
2   | 5 

会社エンティティ

@Entity 
public class Company{ 
    @Id 
    @GeneratedValue 
    private long id; 
    @Column(unique = true) 
    private String name; 
    private String frontPageUrl; 
    private String domainUrl; 
    @OneToOne(cascade = CascadeType.ALL) 
    private MediaGroup mediaGroup; 
    @OneToMany(cascade = CascadeType.ALL) 
    private Set<Activity> activities = new HashSet<>(0); 

活動エンティティ

@Entity 
public class Activity { 
    @Id 
    @GeneratedValue 
    private long id; 
    @Column(unique = true) 
    private String name; 
    private String description; 

私は注釈をかなり一部の設定を試してみました。私はデータベースからアクティビティを取り出して、新しい会社のプロパティに追加しましたが、運はありません。

テストコードメイン:

public class Main { 

    public Main() { 
    } 

    public static void main(String[] args) { 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("MediaObserver"); 
     EntityManager em = emf.createEntityManager(); 

     Seed.companies(em); 

     //emf.close(); 
    } 
} 

テストコードシード:あなたのCompanyエンティティに述べたように

public class Seed { 

    public static void companies(EntityManager em) { 
     init(em); 
     //reuseActivities(em); 
    } 

    private static void reuseActivities(EntityManager em) { 
     em.getTransaction().begin(); 

     Company standaard = selectCompanyByName(em, "De Standaard"); 
     Activity facebook = selectActivityByName(em, "Facebook opinion"); 
     Activity newsWebsite = selectActivityByName(em, "News website"); 
     standaard.getActivities().add(facebook); 
     standaard.getActivities().add(newsWebsite); 
     em.persist(standaard); 

     em.getTransaction().commit(); 
    } 

    private static void init(EntityManager em) { 
     em.getTransaction().begin(); 

     // De Morgen. 
     MediaGroup mediaGroupDM = new MediaGroup("De Persgroep", "Christian van Thillo", "Van Thillo Family"); 
     HashSet<Activity> activities = new HashSet<>(); 
     activities.add(new Activity("News paper")); 
     activities.add(new Activity("News website")); 
     activities.add(new Activity("Facebook opinion")); 
     Company deMorgen = new Company("De Morgen", "http://www.demorgen.be/", mediaGroupDM, activities); 
     em.persist(deMorgen); 

     // Standaard. 
     MediaGroup mediaGroupDS = new MediaGroup("Mediahuis", "Gert Ysebaert", ""); 
     Company standaard = new Company("De Standaard", "http://www.standaard.be/", mediaGroupDS); 
     em.persist(standaard); 

     em.getTransaction().commit(); 
    } 

    private static Company selectCompanyByName(EntityManager em, String companyName) { 
     Query query = em.createQuery("SELECT c FROM Company c " + 
       "WHERE c.name = :name"); 
     query.setParameter("name", companyName); 

     return (Company) query.getSingleResult(); 
    } 

    private static Activity selectActivityByName(EntityManager em, String activityName) { 
     Query query = em.createQuery("SELECT a FROM Activity a " + 
       "WHERE a.name = :name"); 
     query.setParameter("name", activityName); 

     try { 
      return (Activity) query.getSingleResult(); 
     } catch (NoResultException e) { 
      System.out.println(activityName + " not found"); 
      return null; 
     } 
    } 
} 
+0

新しい会社のすべてのアクティビティを再利用したいのですか? –

+0

はい、これは正常化された方法だと思います。 – progonkpa

+0

すべてのテストコードを追加してください。 –

答えて

1

あなたがここにある何が多対多の関係ではなく、@OneToManyです。

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "company_activity", 
    joinColumns = {@JoinColumn(name = "company_id")}, 
    inverseJoinColumns = {@JoinColumn(name = "activity_id")}) 
private Set<Activity> activities = new HashSet<>(0); 
+0

あなたはそうだ、それは働いた!私はより良い関係の種類についていくつかを読んで:) – progonkpa

関連する問題