gpt4 book ai didi

java - JPA、@OneToMany、@ManyToOne 没有联接表,外键从未设置?

转载 作者:行者123 更新时间:2023-12-01 12:48:16 30 4
gpt4 key购买 nike

我在 oneToMany 和 ManyToOne 中有以下两个类

父类:

@Entity    
class ParentBean{

@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id_parent;

@Column( name = "NAME" )
private String name;

@OneToMany( mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER )
private List<ChildBean> revisionList;
}

子类:

@Entity    
class ChildBean {

@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id_child;
private String name;

@ManyToOne( fetch = FetchType.EAGER, cascade = CascadeType.ALL )
@JoinColumn( name = "ID_PARENT", nullable = false )
private ParentBean parent;
}

我使用以下代码来创建 bean:

ParentBean parent = new ParentBean();
parent.setName( "test parent");

List<ChildBean> revList = new ArrayList<>();

ChildBean child = new ChildBean();
child.setName( "test child" );

revList.add ( child );

parent.setRevisionList( revList );

然后我用它来将 bean 结构写入数据库......

@PersistenceContext
private EntityManager em;

@Override
public void addDrawing( FtDrawing drawingIn )
{

em.persist( drawingIn );

em.flush();
}

父 bean 已写入,但出现以下错误,并且子 bean 从未写入

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'ID_PARENT' cannot be null

我在网上浏览了一下,并遵循了几个不同的示例,它们似乎都与我正在做的事情相同...我的数据库是 MySQL,我必须将两个主键设置为 auto_increment。最后一件事。我没有在子表中指定外键来关联回父表...这是必需的吗?我使用的是旧版本的 hibernate,没有必要......

提前感谢您的帮助

最佳答案

要使其正常工作,您必须设置 parent ChildBean的领域。如果不这样做,则该字段为空,并且您的代码表明它不能为空。所以你必须这样做:

ParentBean parent = new ParentBean();
parent.setName( "test parent");

List<ChildBean> revList = new ArrayList<>();

ChildBean child = new ChildBean();
child.setName( "test child" );

revList.add ( child );

child.setParent( parent ); // don't forget this.
parent.setRevisionList( revList );

为了方便,你可以写一个addChild ParentBean中的方法它会自动执行此操作,然后您将永远不必担心:

public class ParentBean {
/* ... */

public void addChild(ChildBean child) {
this.revisionList.add(child);
child.setParent(this);
}

/* ... */
}

然后,只需调用它即可,而不是 parent.getRevisionList().add(child) .

编辑:我认为您的代码中还有更多问题。

  • 您的ParentBeanChildBean应包含 @Id注释放置 @GeneratedValue 的位置一个。
  • IMO,子表中父级的外键是必需的。我认为没有任何理由不设置它。

关于java - JPA、@OneToMany、@ManyToOne 没有联接表,外键从未设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24472054/

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