Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Mysql Java JPA-持久化联接表_Mysql_Hibernate_Jpa_One To Many - Fatal编程技术网

Mysql Java JPA-持久化联接表

Mysql Java JPA-持久化联接表,mysql,hibernate,jpa,one-to-many,Mysql,Hibernate,Jpa,One To Many,嘿 这让我疯狂了好几天。。。希望有人能帮助我 情况: 我有一个简单的数据模型,包括三个表: 产品(sa_s_产品) 组件(sa_s_comp) CompProd(sa_l_CompProd-产品和组件的联接表) 联接表(CompProd)具有其他列 我的(剥离)实体如下所示: @Entity @Table(name = "sa_s_comp") public class SComp implements Serializable { @Id @GeneratedValue(strateg

这让我疯狂了好几天。。。希望有人能帮助我

情况:

我有一个简单的数据模型,包括三个表:

  • 产品(sa_s_产品)
  • 组件(sa_s_comp)
  • CompProd(sa_l_CompProd-产品和组件的联接表)

联接表(CompProd)具有其他列

我的(剥离)实体如下所示:

@Entity
@Table(name = "sa_s_comp")
public class SComp implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int compId;
@Column(unique = true, nullable = false, length = 50)
private String compName;
@Column(length = 50)
private String compDesc;
@Column(nullable = false)
private Boolean compIsOnAvailability;
@Min(value = 0)
@Column(nullable = false)
private int compIndex;
@Column(nullable = false)
private Lkzs lkz;
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date cdate;
@Column(nullable = false)
private String cuser;

@NotNull
@OneToOne(optional = false)
@JoinColumn(name = "compgroupId", nullable = false)
private SCompGroup group;

@OneToMany(mappedBy = "component", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<LCompProd> products;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "transId", unique = true, nullable = true)
private STrans translation;

...

/**
 * Adds the given product to the list of assigned products for this
 * component.
 *
 * @param prod
 *            the product to be assigned
 * @return the component
 */
public void addProduct(SProd prod) {
if (this.products == null)
    this.products = new ArrayList<LCompProd>();
LCompProd compprod = new LCompProd(this, prod);
this.products.add(compprod);
compprod.setComponent(this);
}
.... 有了这段代码,我可以毫无问题地检索组件和相关产品。但是,我无法坚持连接表(CompProd)。即使没有级联,也要用两个独立的模块手动执行此操作

问题是外键约束失败,因为在持久化过程中未在“连接数据对象”中设置组件(compId)的主键

也许手动设置主键/外键是“正常”行为,但我不敢相信hibernate不能处理这个简单的事情?!(希望我是对的;-)

我读了很多文章和博客,尝试了不同的方法,但仍然无法实现(在某种程度上应该实现)

谢谢你的帮助。Thx

PS:我正在使用JPA2(Hibernate)。

似乎您在SComp和SProd对象创建中获得了compId和prodId值

如何将生成的ID传播到LCompProd实体?您确定从中获取值的对象是托管实体吗


例如,如果通过调用创建对象,则参数不会成为托管实体。因此,您不应该直接获取生成的Id。您可以通过方法调用的结果获取它。

我使用联接表中的附加主键尝试了这一点,并调整了实体。这很有效。但是为什么组合主键不能用作外键,或者为什么它们在持久化过程中不被更新?THX ID在“addProduct”方法(例如,this.component.getCompId())中传播,此时该方法当然为0,但在持久化SComp后应设置为正确的值(自动增量)?!管理所有实体。我不使用“合并”来持久化对象。(即使我不知道这是可行的;-)如果我理解得很好,在实体持久化之前,您可以通过#addProduct(..)方法进行赋值(因此Id赋值=>0)。但是您的Id是一个基本类型,以后增量将不会传播,因为它不是对象,所以问题的答案是。。。您必须手动设置id并分两步执行?我认为可以,只要您的id是基本类型。另一种解决方案是使用Integer作为类型。
@Entity
@Table(name = "sa_s_prod")
public class SProd implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int prodId;
@NotNull
private Product.Type prodType;
@NotNull
private String prodName;
private String prodDesc;
private BigDecimal prodQuantityDef;
private Globals.Units prodUnitDef;
private Lkzs lkz;
@Temporal(TemporalType.TIMESTAMP)
private Date cdate;
private String cuser;

@OneToOne(optional = false)
@JoinColumn(name = "subcatId", nullable = false)
private SSubCat subcat;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "transId", unique = true)
private STrans translation;

@OneToMany(mappedBy = "product", fetch = FetchType.EAGER)
private List<LCompProd> components;
@Entity
@IdClass(LCompProdId.class)
@Table(name = "sa_l_compprod")
public class LCompProd implements Serializable {

@Id
private int compId;
@Id
private int prodId;

@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "compId", insertable = false, updatable = false)
private SComp component;

@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "prodId", insertable = false, updatable = false)
private SProd product;

@NotNull
private Lkzs lkz;
@Temporal(TemporalType.TIMESTAMP)
private Date cdate;
private String cuser;
public class LCompProdId implements Serializable {

private int compId;
private int prodId;
....