【问题标题】:JPA on many to many and authority list多对多和权限列表上的 JPA
【发布时间】:2013-08-02 05:23:52
【问题描述】:

我有一个多对多关系 Person - Preferences(这原则上是一个权限列表)。

映射表是 person_has_preferences。 我的目标是在 Person 表中添加一个新对象,而不在 Preferences 中添加该对象。 在当前配置下,所有 3 个表都已更新。

这是我的对象配置:

人:
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "person_has_preference", joinColumns = { @JoinColumn(name = "person_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "preference_id", nullable = false) })
private List<Preference> preferences = new ArrayList<Preference>();

偏好:

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "person_has_preference", joinColumns = { @JoinColumn(name = "preference_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "person_id", nullable = false) })
private List<Person> persons;

持久化在这里完成:

EntityManager em = EMF.get().createEntityManager();
    em.getTransaction().begin();
    if (em.find(Person.class, c.getId()) == null)
        em.persist(c);// new contact
    else
        em.merge(c);// update existing contact

    em.getTransaction().commit();

我还注意到,即使对象 Preference 存在(有一个 ID),JPA 总是会创建一个新 ID。 日志:

[EL Fine]: sql: 2013-08-01 10:22:58.244--ClientSession(2012226930)--Connection(583259044)--Thread(Thread[615154846@qtp-1915686435-7,5,main] )--INSERT INTO 首选项(名称、父级、类型)值(?、?、?) bind => [每周更新,null,1] [EL Finest]:查询:2013-08-01 10:22:58.248--ClientSession(2012226930)--Thread(Thread[615154846@qtp-1915686435-7,5,main])--执行查询ValueReadQuery(name= "SEQ_GEN_IDENTITY" sql="SELECT LAST_INSERT_ID()") [EL Fine]: sql: 2013-08-01 10:22:58.25--ClientSession(2012226930)--Connection(583259044)--Thread(Thread[615154846@qtp-1915686435-7,5,main])--选择 LAST_INSERT_ID() [EL Finest]:排序:2013-08-01 10:22:58.253--UnitOfWork(925539554)--Thread(Thread[615154846@qtp-1915686435-7,5,main])--将序列分配给对象( 126 -> org.icg.contacts.manager.shared.jpa.Preference@19eed47)

【问题讨论】:

  • 标题也说了一些关于权威的东西,但你没有在其他地方提到它,你是在谈论 Spring Security 和 GrantedAuthority 吗?

标签: java jpa many-to-many


【解决方案1】:

您正在使用 CascadeType.ALL 来启用插入。根据您的需要更改您的 CascadeType,例如 CascadeType.REFRESH 或 CascadeType.REMOVE 等。

每个Cascade选项的简单解释:http://www.objectdb.com/api/java/jpa/CascadeType

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多