このコードは、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(下に示すように)で作成されます。
しかし、私は同じ活動を持っている別の会社、この例外がスローされますを追加するとき: 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;
}
}
}
新しい会社のすべてのアクティビティを再利用したいのですか? –
はい、これは正常化された方法だと思います。 – progonkpa
すべてのテストコードを追加してください。 –