JPA将外键插入为null

时间:2013-05-16 19:06:50

标签: java jpa

我有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插入。怎么办呢?

1 个答案:

答案 0 :(得分:1)

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

  

在同步过程中,通过未标记为级联PERSIST的关系找到了新对象

这意味着您尝试持久化的对象(myObj)具有与{{具有[外键]关系的字段/属性(例如foreignProperty) 1}}并且myObj都没有在foreignProperty之前保留,也没有用myObj标记关系,也就是说, CascadeType.PERSIST在数据库中不存在< /强>

解决方案是在之前保留foreignProperty ,或者如上所述设置关系foreignProperty

  

如何将外键插入为空?

由于您要将外部字段设置为CascadeType.PERSIST,因此您不应该在之前保留它(不需要“持久化”null个对象。)

因此,只需将字段设置为null ,然后照常继续null

  

我试图坚持,但收到错误“myObj

此错误消息指出您尝试在某个不可能的位置保留Null values not allowed in column or variable ...值。有一些可能的原因:

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