如何避免在JPA Hibernate One-to-Many中更新父级

时间:2016-05-21 08:44:39

标签: java spring hibernate jpa

我创建了一个使用spring + hibernate(JPA Mapping)的项目。我正在使用One-to-Many JPA Hibernate。我不知道我的设计本身是错还是什么。我有两个类Useradmin(父母)和Tanya(孩子)。从这里我需要通过使用Useradmin(父)的属性从另一个表中获取记录。当我为Tanya(孩子)插入新记录时,Useradmin(Parent)也会更新。我只想插入Tanya(子)whitout插入或更新Useradmin(Parent)。任何机构都可以给我一个解决方案,请建议继续下去:)

这是我的Useradmin类:

List<String> dailyAndSpecialList = new ArrayList<>();
List<String> sideList = new ArrayList<>();
for (int i = 0; i < dishCategory.length; i++) {
  if (dishCategory[i].equals("side Dish")) {
    sideList.add(dishes[i]);
  } else {
    dailyAndSpecialList.add(dishes[i]);
  }
}
String[] sideArray = sideList.toArray(new String[sideList.size()]);
String[] dailyAndSpecialArray = dailyAndSpecialList.toArray(new String[dailyAndSpecialList.size()]);

这是我的Tanya课程:

@SuppressWarnings("serial")
@Entity
@Table(name="user")
public class UserAdmin implements Serializable{

@Id
@Column(name="no_dana", unique=true, nullable=false, updatable=false)
private String no_dana;

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

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

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

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

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

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

@OneToMany(cascade=CascadeType.ALL, mappedBy="useradmin")
private Set<Tanya> tanya  = new HashSet<Tanya>(0);

/**other field**//

/**setter and gettter methods**/
}

这是我的控制者:

@SuppressWarnings("serial")
@Entity
@Table(name="tanya")
public class Tanya implements Serializable{

@Id
@Column(name="id_tanya", unique=true, nullable=false)
private int id_tanya;

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

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

@Temporal(TemporalType.TIMESTAMP)
@Column(name="created")
private Date created;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="no_dana")
private UserAdmin useradmin;

/**other field**//

/**setter and gettter methods**/
}

任何帮助都会很愉快:)

2 个答案:

答案 0 :(得分:1)

如果我理解正确,问题似乎发生在您的

public ModelAndView addTanyaJawab(@ModelAttribute Tanya tanya, ModelMap model, HttpServletRequest request, HttpServletResponse response)throws Exception {...}

方法。您正在创建一个新的Useradmin对象:

    UserAdmin useradmin = new UserAdmin();

这个问题是这个对象是新的,尚未持久存储到数据库中。在创建新的Tanya对象时,您将其引用到新的UserAdmin对象。但是这不存在。

您需要在事先从数据库加载的Tanya对象中设置持久性UserAdmin对象,或者创建一个新的UserAdmin对象,添加Tanya并保存它。

答案 1 :(得分:0)

您可以修改一些内容(即使在测试环境中不是一个好主意):

  • 正如评论区域中已提到的,从cascade注释中删除@ManyToOne属性。
  • 不要将useradmin设置为tanya对象,如下所示:

    tanya.setUseradmin(useradmin);
    

tanya对象保存到数据库之前。否则,持久性提供程序将抛出IllegalStateException,因为cascade属性已被删除。这是合乎逻辑的,因为您的Tanya实体包含UserAdmin实体的外键,提供程序必须在保存useradmin之前检查数据库中是否有tanya条目。 }。

但您创建了UserAdmin的新实例,如下所示:

UserAdmin useradmin = new UserAdmin();

因此,数据库中没有条目。因此,提供程序无法将tanya保存为useradmin不存在的数据库。

以及一些改进代码的建议:

  • 只要不修改默认值,就删除不必要的@Column注释,例如

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

    它没用,因为它是默认行为。

  • 为什么要@SupressWarnings注释?这是不必要的恕我直言。

  • 最后,在真实环境中的以下内容非常危险

    cascade = CascadeType.ALL
    

    特别是CascadeType.REMOVE。