Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠保存或更新或合并以保存/更新一对多关系对象_Java_Mysql_Spring_Hibernate_Google App Engine - Fatal编程技术网

Java 休眠保存或更新或合并以保存/更新一对多关系对象

Java 休眠保存或更新或合并以保存/更新一对多关系对象,java,mysql,spring,hibernate,google-app-engine,Java,Mysql,Spring,Hibernate,Google App Engine,我正在使用SpringMVC3和Hibernate开发一个应用程序。我有两个类用户和租户详细信息与父子关系。在编辑详细信息功能中,我们可以编辑类用户的详细信息,动态添加classTenancyDetails项并保存更改。我正在为此使用hibernate saveorupdate()方法,并且hibernate正在为类用户创建一个新记录,此时它应该更新现有记录。这是我的密码 模型类: @Entity @Table(name="tenancydetails") public class Tenanc

我正在使用SpringMVC3和Hibernate开发一个应用程序。我有两个类用户和租户详细信息与父子关系。在编辑详细信息功能中,我们可以编辑类用户的详细信息,动态添加classTenancyDetails项并保存更改。我正在为此使用hibernate saveorupdate()方法,并且hibernate正在为类用户创建一个新记录,此时它应该更新现有记录。这是我的密码

模型类:

@Entity
@Table(name="tenancydetails")
public class TenancyDetails {

@Column(name="tenancyID")
@Id 
@GeneratedValue
private int tenancyId;  

@Column(name="landlordName")
@NotNull
private String landlordName;

@Column(name="landLordEmail") 
@NotNull
private String landlordEmail;

@Column(name="fromDate") 
@NotNull
private Date fromDate;

@Column(name="toDate")
@NotNull
private Date toDate;

@Column(name="location") 
@NotNull
private String location;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="userId", nullable=false)
private User user;

@Transient 
protected Object[] jdoDetachedState; 

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

public int getTenancyId() {
    return tenancyId;
}

public void setTenancyId(int tenancyId) {
    this.tenancyId = tenancyId;
}

public String getLandlordName() {
    return landlordName;
}

public void setLandlordName(String landlordName) {
    this.landlordName = landlordName;
}

public String getLandlordEmail() {
    return landlordEmail;
}

public void setLandlordEmail(String landlordEmail) {
    this.landlordEmail = landlordEmail;
}

public Date getFromDate() {
    return fromDate;
}

public void setFromDate(Date fromDate) {
    this.fromDate = fromDate;
}

public Date getToDate() {
    return toDate;
}

public void setToDate(Date toDate) {
    this.toDate = toDate;
}

public String getLocation() {
    return location;
}

public void setLocation(String location) {
    this.location = location;
}       
}

@Entity
@Table(name="User")
public class User {
@Column(name="userId")
@Id     
private int userId; 

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

@Column(name="emailId")
@NotEmpty(message = "Please enter your email id")
@Size(max = 50, message = "Email id can only be upto 50 characters long")
private String emailId;

@Column(name="password")
@NotEmpty(message = "Please enter your password")
@Size(max = 20, message = "Password can only be upto 20 characters long")
private String password;    

@OneToMany(cascade={CascadeType.ALL}, fetch = FetchType.EAGER)
@Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN,
    org.hibernate.annotations.CascadeType.PERSIST,
    org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinColumn(name="userId"/*, nullable=true*/)
@LazyCollection(LazyCollectionOption.FALSE)
private List<TenancyDetails> tenancyDetails = null;

public User(){
    tenancyDetails = new AutoPopulatingList<TenancyDetails>(TenancyDetails.class);
}

public List<TenancyDetails> getTenancyDetails() {
    return tenancyDetails;
}

public void addTenancyDetail(TenancyDetails tenancyDetail) {
    if (!tenancyDetails.contains(tenancyDetail)) {
        tenancyDetails.add(tenancyDetail);
    }
}

public void setTenancyDetails(List<TenancyDetails> tenancyDetails) {
    this.tenancyDetails = tenancyDetails;
}

public int getUserId() {
    return userId;
}

public void setUserId(int userId) {
    this.userId = userId;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmailId() {
    return emailId;
}

public void setEmailId(String emailId) {
    this.emailId = emailId;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}   

}
DAO方法:

public void saveProfileDetails(User user){      
        System.out.println("inside the save profile method");
        Session session = getSession();
        Transaction transaction = session.beginTransaction();
        System.out.println("before save: " + user.getPassword());
        System.out.println("before save: " + user.getTenancyDetails().get(0).getUser().getUserId());        
        session.saveOrUpdate(user);
        transaction.commit();
        session.flush();
        System.out.println(user.getPassword());
    }
我还将这两个类的id字段设置为mysql中的自动增量字段。 我使用的一对多映射或@GeneratedValue是否有问题?还是与saveorupdate()方法有关?在这种情况下我应该使用merge()吗?就在saveorupdate()语句之前,已正确打印出现有用户ID的值


有人能告诉我哪里出了问题吗?提前感谢。

我不知道,在呈现表单时,您是如何将
用户
对象放入
模型
的,这最终涉及到您的
“/Profile/{userId}”的POST方法
。您的
用户
对象的
id
变为
0
。这就是
saveOrUpdate
方法再次保存
用户的原因。要验证它,您可以在进入
saveProfileDetails
方法之前添加以下行:

user.setUserId(userId);
你的问题会解决的

您还可以通过将
@SessionAttributes(“user”)
放在您的
“/Profile/{userId}”
GET
POST
方法的所有者控制器之前来解决此问题

另见:


尝试saveorupdate()方法的merge()instate,也可以阅读Show your
User
类。非常感谢您的回复!使用merge()解决了这个问题:)
user.setUserId(userId);