2

我有两个实体。运动的:

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

和运动设施:

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

....
}

然后我在 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,因为表中的运动很少,而且我总是不需要用相同的运动创建新记录...谢谢。

4

2 回答 2

0

有什么作用,

sb.getAllSports();

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

database.entities.sports[ id=0 ]

该错误似乎表明您的一项运动的 id 为 0,这似乎很奇怪?你坚持运动正确吗?

于 2012-12-05T13:46:20.950 回答
0

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

移动

em.getTransaction().begin();

到开始。

于 2012-12-05T10:54:57.037 回答