2013-05-16 101 views
1

我有2个实体其中一个是另一个的外键:JPA插入外键为空

@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,那么它可以插入为空。如何才能做到这一点?

+0

显示代码插入并获取异常的位置。 – acdcjunior

+0

您是否自己创建了“Entities”,或者您是否从数据库生成了它们? – Darwind

+0

@Darwind:实体是从数据库中生成的.. – user2046810

回答

1

当您尝试em.persist(myObj)并且得到错误:

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

这意味着你正在尝试坚持对象(myObj)具有带有[外键]字段/属性(比如foreignProperty)与myObj的关系,并且foreignPropertymyObj之前都没有被保存,也没有关系被标记为CascadeType.PERSIST,即foreignProperty不存在于数据库中但尚未存在于中。

解决的办法是在之前坚持foreignProperty或者如上所述设置关系CascadeType.PERSIST

How can I insert the foreign key as null?

既然你要设置的洋场为null,你不应该坚持之前它(有没有必要“坚持”一个null对象)。

所以,只是单纯的设置字段null,并继续坚持myObj如常。

I tried to persist, but got the error " Null values not allowed in column or variable ... "

此错误消息指出您要坚持某处一个null价值,你不能。有一些可能的原因:

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