JPA(EclipseLink)在没有Cascade.PERSIST的情况下坚持一对多的关系

时间:2012-12-05 00:04:42

标签: java jpa eclipselink

我有两个实体。 运动:

@Entity
public class Sports implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name = "SPORT_NAME")
    private String name;
...
}

和SportFacility:

@Entity
public class SportFacility implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name = "SPORTFAC_NAME")
    private String name;
    @OneToMany
    private List<Sports> sports;

....
}

然后我在运动表中创建了一些运动,例如:

--id-----name-----
- 0  - Football  -   
- 1  - Basketball-
- 2  - Golf      -
------------------

我需要通过一些运动创建运动设施。让我们参加所有运动

        List<Sports> listSports = sb.getAllSports(); //JPQL: SELECT s FROM Sports s

        SportFacility sportFacility = new SportFacility("Stadium", listSports);

        em.getTransaction().begin();            
        em.persist(sportFacility);            
        em.getTransaction().commit();  

错误:

java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: database.entities.sports[ id=0 ].

我不想使用Cascade.ALL或PERSIST因为表中只有少量运动而且我总是不需要用相同的运动创造新的记录...... 谢谢。

2 个答案:

答案 0 :(得分:0)

该异常与以下事实有关:当您尝试持久保存SportFacility时,您检索到的Sports集合不再位于持久性上下文中 - 持久性上下文默认为事务范围(在事务开始时创建并在结束时销毁) - 并且EL不知道如何处理它无法控制的对象。

移动

em.getTransaction().begin();
到了开头。

答案 1 :(得分:0)

做什么,

sb.getAllSports();

做什么?它是使用相同的EntityManager还是使用不同的EntityManager?

database.entities.sports[ id=0 ]

错误似乎表明你的一项运动有一个0 id,这看起来很奇怪?你是否正确地坚持了运动?