gpt4 book ai didi

mysql - Java JPA - 持久连接表

转载 作者:行者123 更新时间:2023-11-29 23:46:26 27 4
gpt4 key购买 nike

嘿!

这让我发疯了几天......希望有人能帮助我。

情况:

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

  • 产品 (sa_s_prod)
  • 组件 (sa_s_comp)
  • CompProd(sa_l_compprod - 这是产品和组件的联接表)

enter image description here

连接表 (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);
}

....

@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;
....

使用此代码,我可以毫无问题地检索组件和相关产品。但是我无法坚持连接表 (CompProd)。即使没有级联地手动执行此操作,仍然有两个独立的持久性。

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

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

我阅读了很多文章和博客,尝试了不同的方法,但仍然无法使其发挥作用(以某种应该实现的方式)。

任何帮助表示赞赏。谢谢。

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

最佳答案

看来您在 SCompSProd 对象创建中获得了 compIdprodId 值。

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

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

关于mysql - Java JPA - 持久连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25910744/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com