我有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插入。怎么办呢?
答案 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
或将其完全删除。 (注意:这可能取决于实现,因此需要确认。)