Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA持续外键限制冲突_Jpa_Eclipselink_Identity - Fatal编程技术网

JPA持续外键限制冲突

JPA持续外键限制冲突,jpa,eclipselink,identity,Jpa,Eclipselink,Identity,我在将新对象持久化到数据库时遇到问题。我正在使用Eclipselink和Postgresql。当我尝试添加新商品时,cascade还会添加Price对象 Price.java @Entity @Table(name = "Prices") public class Price implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = Gener

我在将新对象持久化到数据库时遇到问题。我正在使用Eclipselink和Postgresql。当我尝试添加新商品时,cascade还会添加Price对象

Price.java

@Entity
@Table(name = "Prices")
public class Price implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(updatable = false)
private int id;
@Column(updatable = false, nullable = false)
private float value;
@Column(updatable = false, nullable = false)
private Date startDate;
@Column(updatable = false, nullable = true)
private Date endDate;
@ManyToOne(targetEntity=Merchandise.class,cascade=CascadeType.ALL)
@JoinColumn(name="id",nullable = false,updatable = false,insertable=false)
private Merchandise merchandiseId;
@Column(updatable = false, nullable = true)
private float valueBulk;
@Column(updatable = false, nullable = true)
private float valueRetail;
@Column(updatable = false, nullable = true)
private float makeupPercent;
@Column(updatable = false, nullable = true)
private float makeupForce;
com.java

@Entity
@Table(name="Merchandises")
public class Merchandise implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(updatable = false)
private int id;
@Column(updatable = false)
private int externalId;
@Column(unique = false, nullable = false, updatable = true)
private String name;
@Column(unique = false, nullable = true, updatable = true)
private int available;
@Column(unique = false, nullable = true, updatable = true)
private String description;
@OneToMany(targetEntity = Price.class, mappedBy = "merchandiseId",cascade = CascadeType.PERSIST)
private List<Price> prices;
@OneToMany(targetEntity = MerchandiseCategory.class, mappedBy = "merchandiseId",cascade = CascadeType.PERSIST)
private List<MerchandiseCategory> merchandiseCategories;
@OneToMany(targetEntity = MerchandiseOrder.class, mappedBy = "merchandiseId",cascade=CascadeType.PERSIST)
private List<MerchandiseOrder> merchandiseOrders;
@OneToMany(targetEntity = MerchandiseDiscount.class, mappedBy = "merchandiseId",cascade=CascadeType.PERSIST) //#61
private List<MerchandiseDiscount> discounts; //#61
@实体
@表(名称=“商品”)
公共类商品实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(可更新=false)
私有int-id;
@列(可更新=false)
私有内部外部化;
@列(unique=false,nullable=false,updateable=true)
私有字符串名称;
@列(unique=false,nullable=true,updateable=true)
私人int可用;
@列(unique=false,nullable=true,updateable=true)
私有字符串描述;
@OneToMany(targetEntity=Price.class,mappedBy=“merchandiseId”,cascade=CascadeType.PERSIST)
私人标价;
@OneToMany(targetEntity=MerchandiseCography.class,mappedBy=“merchandiseId”,cascade=CascadeType.PERSIST)
私人商品目录;
@OneToMany(targetEntity=MerchandiseOrder.class,mappedBy=“merchandiseId”,cascade=CascadeType.PERSIST)
私人清单商品订单;
@OneToMany(targetEntity=MerchandiseDiscount.class,mappedBy=“merchandiseId”,cascade=CascadeType.PERSIST)/#61
私人名单折扣;/#61
我在facede中的代码如下所示:

Dao dao = new DAO();//begins transaction etc.
Merchandise m = new Merchandise;
m.set..//setting all needed fields
List<Price> list = new ArrayList<Price>();
Price p = new Price();
p.set..//setting all needed fields
p.setMerchandiseID(m);
list.add(p);
m.setPrices(list);
dao.addMerchandise(m);//persisting
Dao-Dao=newdao();//开始事务等。
商品m=新商品;
m、 设置..//设置所有需要的字段
列表=新的ArrayList();
价格p=新价格();
p、 设置..//设置所有需要的字段
p、 设置商品ID(m);
增加(p);
m、 设定价格(清单);
dao.addMerchanes(m);//坚持
这得到了平均错误(在波兰语中,所以我将尝试翻译):外键限制冲突-key(id)=(356)在商品中不存在

我认为这是生成id的问题,id域总是被生成的id替换,我认为它们是不同的,但在这种情况下应该是相同的

您的Price类使用其“id”字段作为商品的外键。您还标记了要生成的ID属性映射,因此它将始终不同于商品中的ID属性映射。您是否希望Price将其商品的外键用作主键?如果是,您需要从Price中删除@GeneratedValue,并且 1) 需要首先持久化商品,刷新以便分配其主键,然后将值设置为p.setId(),并调用p.setMerchandiseID(m)

或 2) 使用JPA 2.0的派生ID功能,并将Price的merchandiseId属性标记为@ID(并删除不需要的int ID),或使用@MapsId。@MapsId将允许JPA在分配值时自动设置商品的ID值。 一些信息:

如果希望Price有自己的独立主键,则需要在Price表中添加外键:

@多通(targetEntity=commerce.class,cascade=CascadeType.ALL) @JoinColumn(name=“fk\U merchandiseid”,可空=false)
私人商品merchandiseId;

如果数据库正在设置id值,则不能指定GenerationType.AUTO,您需要选择一个适合您数据库的id-可能是IDENTITY。GenerationType.AUTO允许JPA提供商为id选择自己的序列器,然后由数据库覆盖,而提供商不知道。This会导致外键和缓存出现问题。我以前尝试过IDENTITY,结果是一样的…您需要将序列生成器与数据库分配序列的方式相匹配。它是如何分配的?我正在使用JPA创建数据库架构,我在该线程中找不到SQL代码,但它似乎不起作用。。。