1

我有 2 个实体,其中一个是另一个的外键:

@Entity
@Table(name = "XXXX")
@XmlRootElement
public class Drfacopt implements Serializable {
    @Id    
    @NotNull
    @Basic(optional = false)
    @Column(name = "OPCOD")
    private Short optionCode;

    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 50)
    @Column(name = "OPCODDH")
    private String optionCodeDescription;
}

@Entity
@Table(name = "YYYY")
@XmlRootElement
public class Drfac03f implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    protected Drfac03fPK drfac03fPK;    

    @JoinColumn(name = "F3OPT", referencedColumnName = "OPCOD" )
    @ManyToOne(optional = false)    
    private Drfacopt relationCode;
}

当我尝试使用插入新记录时出现em.persist(drfac03f)此异常:

During synchronization a new object was found through a relationship that was not marked cascade PERSIST

如何将外键插入为空?我想要@Null,所以当用户直接向 Drfacopt 插入一条记录时,它不会为 null 或零,但如果它是通过 Drfac03f 那么它可以作为 null 插入。如何才能做到这一点?

4

1 回答 1

1

当您尝试em.persist(myObj)收到错误时:

在同步期间,通过未标记为 cascade PERSIST 的关系找到了一个新对象

这意味着myObj您尝试持久化的对象 ( )具有与 [外键] 关系的字段/属性(例如),之前既没有持久化,也没有标记关系,也就是说,在数据库中不存在还foreignPropertymyObjforeignPropertymyObjCascadeType.PERSISTforeignProperty

解决方案是坚持foreignProperty 之前的,或者如前所述,设置关系CascadeType.PERSIST

如何将外键插入为空?

由于您想将外部字段设置为null,因此您之前不应将其持久化(无需“持久化”null对象)。

因此,只需将字段设置为null并继续myObj照常进行。

我试图坚持,但得到错误“ Null values not allowed in column or variable ...

此错误消息表明您正在尝试将null值保留在您无法做到的地方。有一些可能的原因:

  • 很可能数据库中的实际列是NOT NULL. 解决方案:将其设置为NULL.
  • 关系标记为(optional = false)。解决方案是将该optional属性设置为true或完全删除它。(注意:这可能取决于实现,因此需要确认。)
于 2013-05-19T09:22:15.650 回答