2012-01-27 42 views
1
@Entity 
@Table(name = "parent") 
public final class Parent extends Base { 

@OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) 
private Person person; 

和做(除其他事项外)之前保存的瞬态的实例是:Hibernate的级联:对象引用一个未保存的瞬态的实例 - 冲洗

Parent parent = new Parent(); 
Person person = new Person(); 
parent.setPerson(person); 
session.save(parent); 

我得到的提到的例外?

我需要手动调用session.save(person)吗?是否必须将级联类型注释添加到childs类定义(它引用父级的位置)?

还是我错过了其他明显的东西?

我不想使用CascadeType.ALL作为父项被删除时我想保留这个人(孩子)。

两个实体/表延伸的公共基地台:

@MappedSuperclass() 
public abstract class Base { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id; 

    public Integer getId() { 
    return id; 
    } 

将需要此效应,其级联类型?

+0

是一切正常与两代实体的身份证代? – TC1 2012-01-27 12:05:58

+0

有没有直到保存,但孩子(人)没有被保存,只是尝试所有而不是坚持和工程...所以我想也许它的onetoone映射需要所有,而不是坚持。但我很可能是错的...... – NimChimpsky 2012-01-27 12:09:01

+1

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec- cascade 试试'{PERSIST,MERGE}' – TC1 2012-01-27 12:14:00

回答

5

你还没有提到Hibernate版本,但是自从我开始使用它之后,这并没有改变。

正如你可以在Hibernate reference中看到的,要获得Java标准SAVE_UPDATE,你需要在Hibernate中使用{CascadeType.PERSIST, CascadeType.MERGE}

编辑:看到更新的信息,你现在正在做的事情导致Hibernate把它当作一个双向的一对一映射。这基本上意味着对于这两个表中的任何一个中的每个对象,必须是对方在具有相同ID的另一个表中。因此,你不能只删除其中的一个,你会失去FK的完整性。

如果你希望它是一个单向的映射,比如,如果你希望能够删除的人,但离开父母 - 通过@JoinColumn你必须指定一个FK,通常情况下,像 @JoinColumn(name="PERSON_ID", unique=false, nullable=true, insertable=true, updatable=true)

+0

它必须是hibernate或jpa,ALL正在为我工​​作,但合并和坚持在一起不是。我使用休眠4 btw。 OneToOne映射是否会造成问题? – NimChimpsky 2012-01-27 12:30:03

+0

@NimChimpsky如何生成ID?另一方面,在'Person'类中呢? – TC1 2012-01-27 12:41:50

+0

它们是自动生成的,在保存成功之前都没有ID。 CascadeType.ALL工作正常......但我不想要这个,我想让孩子留下,即使父母被删除。 – NimChimpsky 2012-01-27 12:43:57

相关问题