gpt4 book ai didi

java - JPA 2.1 hibernate 一对多约束违反重复条目

转载 作者:行者123 更新时间:2023-12-02 03:22:55 25 4
gpt4 key购买 nike

此代码保留具有 Activity 哈希集的 Company 实体。

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 和 Activity ID,如下所示。

Result in the DB

但是当我添加另一家具有相同 Activity 的公司时,会抛出此异常:MySQLIntegrityConstraintViolationException:键“UK_9j7c1qdg3rnhjioqut33ki7pr”的重复条目“3”

我知道它不希望在activities_id列中出现重复项,但我试图实现的是:

Company_id | activities_id-----------|--------------1          | 31          | 41          | 52          | 32          | 42          | 5

The Company entity

@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);

Activity 实体

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

我尝试了很多带有注释的配置。我还从数据库中获取了 Activity 并将它们添加到新公司的属性中,但没有成功。

测试代码主要:

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();
}
}

测试代码种子:

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;
}
}
}

最佳答案

这里是多对多关系,而不是您在 Company 实体中所述的 @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);

关于java - JPA 2.1 hibernate 一对多约束违反重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39385436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com