Jpa 我需要设置孩子的家长吗?
我遇到了一个问题,域(子域)没有获取业务(父域)id。我创建了业务并创建了域,但域没有业务id。下面是我最初的操作。然后我创建了一个我调用的测试路径,该路径给出了相同的行为,除非我使用了Jpa 我需要设置孩子的家长吗?,jpa,jakarta-ee,eclipselink,Jpa,Jakarta Ee,Eclipselink,我遇到了一个问题,域(子域)没有获取业务(父域)id。我创建了业务并创建了域,但域没有业务id。下面是我最初的操作。然后我创建了一个我调用的测试路径,该路径给出了相同的行为,除非我使用了域的setBusiness方法。这是期望吗?我是否需要在从客户端传递的域上循环并设置业务 测试 public void test() { Business b = new Business(); b.setName("Test Test"); Domain d1 = new Domain(
域的setBusiness
方法。这是期望吗?我是否需要在从客户端传递的域上循环并设置业务
测试
public void test() {
Business b = new Business();
b.setName("Test Test");
Domain d1 = new Domain();
d1.setName("Domain 1");
d1.setBusiness(b);
em.persist(b);
em.flush();
}
代码
@Entity
@Table(name = "Business")
public class Business {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy="business", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Domain> domains = new ArrayList<>();
//...getters and setters
}
我使用下面的JSON调用了一个rest服务,该服务将业务持久化
{
"name": "Business Test ",
"domains": [{"name": "test domain"}]
}
@Path("business")
public class BusinesResouce {
@EJB
BusinessService service;
@Path("create")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void create(Business entity) {
service.persist(entity);
}
//other paths
}
-
对必须设置“拥有”外键的关系的一侧。现实地说,你应该设置两边,使它们保持同步。@Chris哦,很好,配置不错。你能把这两种设置都展开吗?我认为这就是注释保持同步的关键所在。它们只是java对象,所以如果设置一边,就必须设置另一边。换句话说,如果一个关系为null,而另一个关系被设置,那么哪一个是正确的?mapped by声明“另一方”控制外键,以便使用所有者关系,并且必须至少将其设置为您在数据库中想要的关系,但是有很多帖子都是关于为什么要在对象上设置两边,以使它们与数据库中的内容保持同步。@Chris这只是说在persist方法中我应该执行entity.setDomains(domains)
?我能挖出来。这是我用JPA从头开始的第一个项目。我已经习惯了这些东西。
{
"name": "Business Test ",
"domains": [{"name": "test domain"}]
}
@Path("business")
public class BusinesResouce {
@EJB
BusinessService service;
@Path("create")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void create(Business entity) {
service.persist(entity);
}
//other paths
}
@Stateless
public class BusinessService {
private static final String PERSISTENCE_UNIT_NAME = "edc";
@PersistenceContext(unitName = PERSISTENCE_UNIT_NAME)
private EntityManager em;
public void persist(Business entity) {
em.persist(entity);
//Do I really need to loop entity.getDomains and setBusiness?
em.flush();
}
}