Java Hibernate级联:对象引用未保存的临时实例-在刷新之前保存临时实例

Java Hibernate级联:对象引用未保存的临时实例-在刷新之前保存临时实例,java,hibernate,orm,Java,Hibernate,Orm,以及(除其他事项外)进行以下工作: 我有提到的例外情况吗 我是否需要在之前手动调用session.save(person)?我是否必须将级联类型注释添加到childs类定义中(它引用父类) 还是我错过了其他明显的东西 我不想使用CascadeType.ALL,因为删除父对象时,我希望保留该人(子对象) 两个实体/表都扩展了一个公共基表: Parent parent = new Parent(); Person person = new Person(); parent.setPerson(per

以及(除其他事项外)进行以下工作:

我有提到的例外情况吗

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

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

我不想使用CascadeType.ALL,因为删除父对象时,我希望保留该人(子对象)

两个实体/表都扩展了一个公共基表:

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

这会影响到需要哪种级联类型吗?

您没有提到Hibernate版本,但自从我开始使用它以来,它一直没有改变

如中所述,要获取Java标准
SAVE_UPDATE
,需要在Hibernate中使用
{CascadeType.PERSIST,CascadeType.MERGE}

编辑:看到更新的信息,您现在所做的将使Hibernate将其视为双向一对一映射。这基本上意味着,对于这两个表中的任何一个表中的每个对象,必须在另一个表中有一个具有相同ID的对应项。因此,不能仅删除其中一个,否则将失去FK完整性

如果您希望它是一个单向映射,例如,如果您希望能够删除此人但离开父对象,则必须指定一个FK,通常通过
@JoinColumn
,如
@JoinColumn(name=“PERSON\u ID”,unique=false,nullable=true,insertable=true,updateable=true)

您没有提到Hibernate版本,但自从我开始使用它以来,它一直没有改变

如中所述,要获取Java标准
SAVE_UPDATE
,需要在Hibernate中使用
{CascadeType.PERSIST,CascadeType.MERGE}

编辑:看到更新的信息,您现在所做的将使Hibernate将其视为双向一对一映射。这基本上意味着,对于这两个表中的任何一个表中的每个对象,必须在另一个表中有一个具有相同ID的对应项。因此,不能仅删除其中一个,否则将失去FK完整性

如果您希望它是一个单向映射,例如,如果您希望能够删除此人但离开父对象,则必须指定一个FK,通常通过
@JoinColumn
,如
@JoinColumn(name=“PERSON\u ID”,unique=false,nullable=true,insertable=true,updateable=true)

这两个实体的ID生成都正常吗?保存之前没有,但是子实体(PERSON)没有被保存,只是尝试了ALL而不是persist,这样就可以了。。。因此,我认为可能是OneTONE映射需要所有,而不仅仅是坚持。但我可能错了。。。尝试
{PERSIST,MERGE}
@NimChimpsky-您需要CascadeType.MERGE(除了您已经拥有的CascadeType.PERSIST之外)。狼吞虎咽!被TC1击败一分钟。两个实体的ID生成都正常吗?在保存之前没有,但是子(人)没有被保存,只是尝试了全部而不是坚持,这样就可以了。。。因此,我认为可能是OneTONE映射需要所有,而不仅仅是坚持。但我可能错了。。。尝试
{PERSIST,MERGE}
@NimChimpsky-您需要CascadeType.MERGE(除了您已经拥有的CascadeType.PERSIST之外)。狼吞虎咽!它必须是hibernate或jpa,所有这些都对我有效,但合并和持久化不起作用。顺便说一句,我使用的是hibernate 4。OneTONE映射是问题的原因吗?@NimChimpsky ID是如何生成的?在
Person
类的另一端是什么?它们是自动生成的,在成功保存之前都没有id。一切都很好。。。但我不希望这样,我希望即使父项被删除,子项也能留下来。@这很重要,因为只有当Hibernate将其视为共享PK时,您才能拥有
ALL
。如果希望person映射是单向的,则可能需要在person映射上显式声明一个
@JoinColumn
。如果看不到ID是如何创建的(我知道它是生成的,这一部分很明显——它是如何注释的?)我真的不能告诉你更多…我实际上希望能够删除父项并保留子项?它必须是hibernate或jpa,所有这些都对我有用,但合并和持久化并不是。顺便说一句,我使用的是hibernate 4。OneTONE映射是问题的原因吗?@NimChimpsky ID是如何生成的?在
Person
类的另一端是什么?它们是自动生成的,在成功保存之前都没有id。一切都很好。。。但我不希望这样,我希望即使父项被删除,子项也能留下来。@这很重要,因为只有当Hibernate将其视为共享PK时,您才能拥有
ALL
。如果希望person映射是单向的,则可能需要在person映射上显式声明一个
@JoinColumn
。如果看不到ID是如何创建的(我知道它是生成的,这一部分很明显——它是如何注释的?)我真的不能告诉你更多…我实际上希望能够删除父项并保留子项?
Parent parent = new Parent();
Person person = new Person();
parent.setPerson(person);
session.save(parent);
@MappedSuperclass()
public abstract class Base {

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

    public Integer getId() {
    return id;
    }