我创建了一个使用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**/
}
任何帮助都会很愉快:)
答案 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。