Java 打开JPA Saving OneToMany,未设置外键

Java 打开JPA Saving OneToMany,未设置外键,java,openjpa,Java,Openjpa,我有两张桌子:TaStock和TaStockPrice。表TaStockPrice中的字段tastockid是表TaStock的外键 @Entity public class TaStock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Integer id @OneToMany(mappedBy = "taStock", fetch = FetchType.LAZY, cascade =

我有两张桌子:TaStock和TaStockPrice。表TaStockPrice中的字段tastockid是表TaStock的外键

@Entity
public class TaStock {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Integer id

    @OneToMany(mappedBy = "taStock", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<TaStockPrice> tastockpriceList;

    public void addTaStockPrice(TaStockPrice taStockPrice) {
       if (taStockPrice == null) {
           return;
       }
       taStockPrice.setTaStock(this);
       if (tastockpriceList == null) {
           tastockpriceList = new ArrayList<TaStockPrice>();
           tastockpriceList.add(taStockPrice);
       } else if (!tastockpriceList.contains(taStockPrice)) {
           tastockpriceList.add(taStockPrice);
       }
    }
    ....
}



@Entity
public class TaStockPrice {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Integer id
    @Column
    private Integer tastockid;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "tastockid", nullable = false, updatable = false, insertable = false)
    private TaStock taStock;
    ...
}
我了解到,当持久化父类时,hibernate会自动持久化该类的子类。但是,出现以下例外情况:


javax.persistence.PersistenceException:org.hibernate.exception.ConstraintViolationException:错误:“tastockid”列中的null值违反了非null约束

您正在将集合设置为不可插入或不可更新。这样冬眠就永远不会持续下去了


您可以使用注释中的级联设置来设置hibernate应该如何处理这种关系。关于更多信息,这里有一篇关于这个主题的完整博文:。

我从
TaStockPrice
中删除了
private Integer tastockid“
,并进行了修改
@JoinColumn(name=“tastockid”,nullable=false,updateable=false,insertable=true)
来解决这个问题。

tastockpriceList上使用下面的注释

@OneToMany

@Cascade(CascadeType.ALL)

@JoinColumn(name=“tastock”)


这应该可以解决问题。

为了在
@OneToMany
关系上启用保存功能,例如

@OneToMany(mappedBy="myTable", cascade=CascadeType.ALL)
private List<item> items;

为什么需要
tastockid
列定义?JPA不是这样工作的,您可以通过
taStockPrice.getTaStock().getId()
引用外键。您好,我在www.mkyong.com上查看了这个示例。为了与示例同步,我只需添加语句taStockPrice.setTaStock(taStock);。集合是可插入/可更新的,因为我用:cascade=CascadeType.ALL注释了集合。我仍然有相同的异常消息。在我当前的设置中,hibernate似乎没有设置字段tastockid。如何确保hibernate将tastockid识别为外键,并在保存TaStock时设置此字段DB表tastockprice,以下字段定义为“tastockid integer NOT NULL”,并且以下约束:约束tastockprice\u tastockid\u fkey外键(tastockid)引用tastock(id)MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE我必须在我的子列定义上设置
insertable=false,updateable=false
,才能使级联插入生效。谢谢。我有
@OneToOne
连接,也有同样的问题。我已经删除了
nullable=false,updateable=false
,这解决了my问题。非常感谢,这也为我解决了问题。您是否解释了将insertable设置为true如何解决问题?谢谢!
@OneToMany(mappedBy="myTable", cascade=CascadeType.ALL)
private List<item> items;
@ManyToOne
@JoinColumn(name="fk_myTable", nullable = false, updatable = true, insertable = true)