2010-03-14 74 views
68

我试图运行这个基本的JPA/EJB代码:“分离的实体传递给坚持错误” 使用JPA/EJB代码

public static void main(String[] args){ 
     UserBean user = new UserBean(); 
     user.setId(1); 
     user.setUserName("name1"); 
     user.setPassword("passwd1"); 
     em.persist(user); 
    } 

我得到这个错误:

javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.JPA.Database 

任何想法?

我在互联网上搜索,我发现原因是:

This was caused by how you created the objects, i.e. If you set the ID property explicitly. Removing ID assignment fixed it.

但我没有得到它,我将不得不修改获取代码的工作?

回答

45

ERD

假设您有两个实体AlbumPhoto。相册包含很多照片,所以它是一对多的关系。

Album类

@Entity 
public class Album { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    Integer albumId; 

    String albumName; 

    @OneToMany(targetEntity=Photo.class,mappedBy="album",cascade={CascadeType.ALL},orphanRemoval=true) 
    Set<Photo> photos = new HashSet<Photo>(); 
} 

照片类

@Entity 
public class Photo{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    Integer photo_id; 

    String photoName; 

    @ManyToOne(targetEntity=Album.class) 
    @JoinColumn(name="album_id") 
    Album album; 

} 

你必须做之前持续存在或合并什么是设置在各张照片的相册参考。

 Album myAlbum = new Album(); 
     Photo photo1 = new Photo(); 
     Photo photo2 = new Photo(); 

     photo1.setAlbum(myAlbum); 
     photo2.setAlbum(myAlbum);  

这就是在持续或合并之前如何附加相关实体。

+0

如果你使用泛型,没有必要使用“targetEntity = Photo.class” – Rollerball 2016-03-01 17:36:56

+0

嗨,将相册对象设置为photo1后nad photo2 ...我们必须保存哪些对象照片或相册列表? – 2017-01-23 06:06:20

11

我得到了答案,我用的是:

em.persist(user); 

我用来代替合并坚持:

em.merge(user); 

但不知道为什么坚持不工作。 :(

+9

这不是解决方案! – 2011-04-19 06:50:09

+0

我知道,但这对我有用。任何其他答案在哪里为你工作?如果是的话,那么我将非常乐意选择它。 – zengr 2011-04-19 16:26:05

+4

它的工作原理是因为你的对象从hibernate会话中分离出来,或者对象是暂时的,但是hibernate将它看作是分离的,因为你得到了主键声明,通过使用合并,你再次将对象附加到会话中,这使得你可以更新对象数据库;请参阅:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-detached – Ben 2012-06-04 16:25:12

112

发生错误是因为对象的ID已设置,Hibernate区分瞬态对象和分离对象,并且persist仅适用于瞬态对象,如果persist得出结论对象已分离(这是因为ID已设置)将返回错误“传递给坚持分离的对象”你可以找到更多的细节和here

然而,这仅适用如果您指定的主键是自动生成的:。如果配置领域要始终手动设置,那么你的代码工作。

+0

当我说我正在使用JPA而不是Hibernate时,我在技术上是否正确,上述说法不适用?我是JPA的新手(准确地说,3位): – zengr 2010-03-14 20:01:57

+0

Sun的JPA Javadoc(http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html#persist(java.lang) .Object))和Toplink的完全一样,并建议你在技术上是正确的。然而,它真的归结为规范说的坚持()应该表现得像和可悲的,我不知道那是什么。 – 2010-03-14 21:07:55

+0

该解决方案适用于我。我坚持一个对象,将ID保存在某个地方。 然后我想用新值覆盖现有的对象,所以我创建了该对象,将该ID复制回来,并且当我试图保存时它就炸毁了。 最后,我不得不重新查询数据库(findById),进行更改,然后保留*那个*对象。 – cs94njw 2012-01-27 15:32:03

2

我有这个问题,它是由二级缓存造成的:

  1. 我坚持使用Hibernate
  2. 然后,我删除了一个单独的进程未与互动创造了该行的实体第二级高速缓存
  3. 我坚持具有相同标识符的另一实体(我的标识符值不是自动产生)

因此,由于高速缓存未无效,HIB ernate认为它正在处理同一实体的分离实例。

19

删除

user.setId(1); 

,因为它是自动生成的DB, 并继续坚持命令。

4

我知道它的种类太晚和pr every,每一个人都得到了答案。但是增加一点点:在设置GenerateType时,对象上的persist()需要生成一个id。

如果用户已经设置了一个值,hibernate会将其视为已保存的记录,因此将其视为已分离。

如果id为空 - 在这种情况下,当类型为AUTO或身份等,除非ID从表中生成或sequece等

设计一个空指针异常引发:发生这种情况时,表有一个bean属性作为主键。 只有在自动生成id时才必须设置GenerateType。 删除此插入应与用户指定的ID一起工作。 (这是一个不好的设计,有一个属性映射到主键字段)

4

这里.persist()只会插入记录。如果我们使用.merge()它会检查是否有任何记录存在与当前ID,如果存在则更新,否则会插入新记录。

+0

我花了很多时间,直到我找到答案。非常感谢你! – 2016-05-17 22:03:25

7

如果您用于在您的实体中生成id = GenerationType.AUTO策略。

取代user.setId (1)通过user.setId (null),问题就解决了。

1

如果您在数据库中设定的ID是主键和自动增量,那么这行代码是错误的:

user.setId(1); 

试试这个:

public static void main(String[] args){ 
     UserBean user = new UserBean(); 
     user.setUserName("name1"); 
     user.setPassword("passwd1"); 
     em.persist(user); 
    } 
+0

我试过了,我知道得到这个错误:'detached entity to persist' – s1ddok 2016-03-11 17:41:57

0

另一个原因是错误的实体对象不实现Serializable接口

@Entity 
@Table(name = OddInstance.objectName, uniqueConstraints = @UniqueConstraint(columnNames = {"alias"})) 
@NamedQueries({ 
    @NamedQuery(name=OddInstance.findByAlias, 
      query="from OddInstance where alias = :alias"), 
    @NamedQuery(name=OddInstance.findAll, 
      query="from OddInstance") 
}) 
public class OddInstance implements Serializable { 
    // ... 
} 
相关问题