当前位置: 首页 > 知识库问答 >
问题:

hibernate与master值一对一保存

胡泓
2023-03-14

想要保存一个一对一的主值,如下所示。有一个address类,它包含一个city类一对一。但是city是我的主值,当我保存地址时我不想更新它。只需要从UI的下拉菜单中选择city并将对象设置为原来的地址并保存地址。但是当保存时getting below错误。

org.hibernate.transientPropertyValueException:对象引用了一个未保存的瞬态实例-在刷新之前保存瞬态实例:com.app.fd.entity.address.city->com.app.fd.entity.city

@Entity
public class Address extends BaseEntity implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CONTACT_SEQ_GEN")
@SequenceGenerator(name="CONTACT_SEQ_GEN", sequenceName = "CONTACT_SEQ", allocationSize=5)
@Column(name = "id", updatable = false, nullable = false)
private Long id;

@Size(max = 50)
@NotNull
private String address1;

@Size(max = 50)
private String address2;

@Size(max = 15)
@NotNull
private String state;

@Size(max = 10)
@NotNull
private String pin;

@Size(max = 255)
private String landmark;

private Boolean deleted;

@OneToOne()
@JoinColumn(name = "city_id", insertable=false,updatable=false)
private City city;

}


@Entity
public class City {

/**
 * 
 */

private static final long serialVersionUID = 1L;


@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

@Size(max = 30)
@Column(name = "name",unique = true)
private String name;

@Size(max = 5)
@Column(name = "code",unique = true)
private String code;
}




repository.save(address); // TransientPropertyValueException error

共有1个答案

卞经业
2023-03-14

出现此错误是因为您正在用未保存/分离的City实体保存Address实体。为了解决这个问题,您可以使用CascadeType.All,但在您的情况下,您不想修改city对象。您可以使用以下方法。

City cityFromUI = new City();
cityFromUI.setId(id); //get this id from UI. Store city dropdown as key = id and value = cityName
Address myNewAddress = new Address();
myNewAddress.set*()//Set other address fields
myNewAddress.setCity(cityFromUI);
repository.save(address);

使用上面的代码,您的地址将映射到相应的城市,并且您的城市不会更新,因为您在address实体中将updatable定义为false

 类似资料:
  • 问题内容: 我在父方使用批注具有一对一关系。现在,我想自己保存子实体。 例如,我有和作为孩子的实体,我需要保存(父的id属性设置为之后的课程)。但是,当使用这种安排时,我在下面列出了一个例外… 为什么hibernate不允许这样做的任何想法?更清楚地说,我的代码如下… ParentEntity: ChildEntity: 我尝试保存的方式是… 关于如何尝试保存子实体,任何指针将不胜感激。 问题答案

  • 我有一对一关系的问题-保存后,外键总是被设置为空,即使我有关联的对象。我正在使用Hibernate4.3。7.最终版本为Spring 4.0。0.0版本和MySql 5.6数据库。 在我保存LawFirmProfile对象列后的情况下,参考lawFirm的lawFirm_id始终为空。 实体: 以下是负责保存此记录的代码: Hibernate和Spring配置: 道也是Spring豆,方法注释为@

  • 问题内容: 我正在从UI发送对象。将使用对现有子项的引用来创建该对象。 这是这种关系的简单说明。 保存该对象时,Hibernate给我“ org.hibernate.TransientPropertyValueException:对象引用了一个未保存的瞬态实例”。 我根本不需要改变孩子,所以不必拯救孩子。只需要将孩子的ID保存在父母的表中。 我尝试使用一些CascadeType,但没有一个起作用。

  • 我有示例代码来检查双向关系是如何工作的。 我可以看到这种表h2表:- A:- B:- 对于B表,我期待一个列,正如我在代码中提到的。 所以我在我的控制器中,如果我试图检索B,如下所示:- 它就像一条链条,一条链条,一条链条。我正在学习hibernate和表的关系。显然我误解了什么。我的目的是双向的,当我加载A时,我可以访问相关的B。同样,当我加载B时,我可以访问相关的A。我如何实现这个目标?

  • 问题内容: 我正在尝试在Hibernate中将一对一关系映射为“零或一个”关系。我想我可能已经找到了使用多对一方法。 A类的映射指定: B类的映射指定: 我想在数据库中找不到B的匹配行时b为null。所以我可以做到这一点(在A类中): 但是,看来b永远不会为空。 我该怎么办? 问题答案: 答案是在A中的多对一语句中添加not-found =“ ignore”: 我尝试按照Rob H的建议,简单地向

  • 我有两个不同的表,Person表和Employee表。我需要这两者之间的一对一映射。Employee表的emp_id引用Person表的person_id。在使用注释编写映射方面我需要一些帮助