Java-使用Address对象更新用户对象的两个复杂字段(办公室地址和家庭地址)

Java-使用Address对象更新用户对象的两个复杂字段(办公室地址和家庭地址),java,setter,Java,Setter,我在和Hibernate和Postgres玩。 我有一个用户类,如下所示 import javax.persistence.AttributeOverride; import javax.persistence.AttributeOverrides; import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistenc

我在和Hibernate和Postgres玩。 我有一个用户类,如下所示

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;

@Entity
@Table(name="USER_DETAILS")
public class UserDetails {

@Id @GeneratedValue
private int userId;
private String userName;
@Temporal(TemporalType.DATE)
private Date joinedDate;
@Embedded
private Address homeAddress;
@Embedded
@AttributeOverrides({
    @AttributeOverride(name="street", column = @Column(name="OFFICE_STREET_NAME")),
    @AttributeOverride(name="city", column = @Column(name="OFFICE_CITY_NAME")),
    @AttributeOverride(name="state", column = @Column(name="OFFICE_STATE_ABBR")),
    @AttributeOverride(name="pincode", column = @Column(name="OFFICE_PIN_CODE"))
})
private Address officeAddress;

@Lob
@Type(type="text")
private String description;

public int getUserId() {
    return userId;
}
public void setUserId(int userId) {
    this.userId = userId;
}
public String getUserName() {
    return userName;
}
public void setUserName(String userName) {
    this.userName = userName;
}
public Date getJoinedDate() {
    return joinedDate;
}
public void setJoinedDate(Date joinedDate) {
    this.joinedDate = joinedDate;
}
public String getDescription() {
    return description;
}
public void setDescription(String description) {
    this.description = description;
}
public Address getHomeAddress() {
    return homeAddress;
}
public void setHomeAddress(Address homeAddress) {
    this.homeAddress = homeAddress;
}
public Address getOfficeAddress() {
    return officeAddress;
}
public void setOfficeAddress(Address officeAddress) {
    this.officeAddress = officeAddress;
}
}
地址类,如下所示

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class Address {
@Column(name="STREET_NAME")
private String street;
@Column(name="CITY_NAME")
private String city;
@Column(name="STATE_NAME")
private String state;
@Column(name="PINCODE_NUMBER")
private String pincode;
public String getStreet() {
    return street;
}
public void setStreet(String street) {
    this.street = street;
}
public String getCity() {
    return city;
}
public void setCity(String city) {
    this.city = city;
}
public String getState() {
    return state;
}
public void setState(String state) {
    this.state = state;
}
public String getPincode() {
    return pincode;
}
public void setPincode(String pincode) {
    this.pincode = pincode;
}
}
import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.loganathan.divakar.dto.Address;
import org.loganathan.divakar.dto.UserDetails;

public class HibernateTest {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    UserDetails user = new UserDetails();
    user.setUserName("First User");
    user.setJoinedDate(new Date());
    user.setDescription("First User Description");

    Address addr = new Address();

    addr.setStreet("Home Street");
    addr.setCity("Home City");
    addr.setState("Home State Abbr");
    addr.setPincode("Home PinCode");
    user.setHomeAddress(addr);

    addr.setStreet("Office Street");
    addr.setCity("Office City");
    addr.setState("Office State");
    addr.setPincode("Office PinCode");
    user.setOfficeAddress(addr);

    SessionFactory sessionFactory = new 
    Configuration().configure().buildSessionFactory();
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    session.save(user);
    session.getTransaction().commit();
    session.close();
}

}
主要类别如下所示

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class Address {
@Column(name="STREET_NAME")
private String street;
@Column(name="CITY_NAME")
private String city;
@Column(name="STATE_NAME")
private String state;
@Column(name="PINCODE_NUMBER")
private String pincode;
public String getStreet() {
    return street;
}
public void setStreet(String street) {
    this.street = street;
}
public String getCity() {
    return city;
}
public void setCity(String city) {
    this.city = city;
}
public String getState() {
    return state;
}
public void setState(String state) {
    this.state = state;
}
public String getPincode() {
    return pincode;
}
public void setPincode(String pincode) {
    this.pincode = pincode;
}
}
import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.loganathan.divakar.dto.Address;
import org.loganathan.divakar.dto.UserDetails;

public class HibernateTest {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    UserDetails user = new UserDetails();
    user.setUserName("First User");
    user.setJoinedDate(new Date());
    user.setDescription("First User Description");

    Address addr = new Address();

    addr.setStreet("Home Street");
    addr.setCity("Home City");
    addr.setState("Home State Abbr");
    addr.setPincode("Home PinCode");
    user.setHomeAddress(addr);

    addr.setStreet("Office Street");
    addr.setCity("Office City");
    addr.setState("Office State");
    addr.setPincode("Office PinCode");
    user.setOfficeAddress(addr);

    SessionFactory sessionFactory = new 
    Configuration().configure().buildSessionFactory();
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    session.save(user);
    session.getTransaction().commit();
    session.close();
}

}
因此,现在当我运行Main类时,user对象的HomeAddress和OfficeAddress都有值(OfficeAddress),我特意使用了相同的地址对象“addr”

首先将值设置为具有家庭地址详细信息的addr对象,然后将addr对象设置为UserDetails对象(用户)的homeAddress字段

然后将值设置为具有Office address details的addr对象,然后将addr对象设置为UserDetails对象(用户)的officeAddress字段

如果我在main类中使用两个Address对象(homeAddr和offAddr对象)来设置userDetails对象的homeAddr和OfficeAddress值,那么这种方法完全可以实现

但我想尝试使用一个Address对象为Home和Office Address设置不同的值

我知道我们可以使用相同的address对象来设置UserDetails类的Home和Office地址字段的值,逻辑上是这样的。 但我无法理解为什么homeAddress值会被OfficeAddress值覆盖(即使在设置User.homeAddress字段之后,甚至在输入OfficeAddress值之前)

我甚至使用调试模式进行了调试,以了解为什么homeAddress值会被OfficeAddress值覆盖

非常感谢您提供任何有助于理解为什么家庭地址值被办公室地址值覆盖的信息。请提前感谢

问候,,
Divakar

发生这种情况是因为您仍在使用同一地址对象。如果希望它们是单独的地址,则必须创建一个新地址

Address addr = new Address();
addr.setStreet("Home Street");
addr.setCity("Home City");
addr.setState("Home State Abbr");
addr.setPincode("Home PinCode");
user.setHomeAddress(addr);

addr = new Address(); // make a new address
addr.setStreet("Office Street");
addr.setCity("Office City");
addr.setState("Office State");
addr.setPincode("Office PinCode");
user.setOfficeAddress(addr); 
当您将地址设置为家庭地址时,
addr
和用户的
homemaddress
正在引用同一个地址对象,对它的更改将反映在这两个位置。

Gotcha:)非常感谢,我被对象引用部分欺骗了;)现在事情清楚了。
Address addr = new Address();
addr.setStreet("Home Street");
addr.setCity("Home City");
addr.setState("Home State Abbr");
addr.setPincode("Home PinCode");
user.setHomeAddress(addr);

addr = new Address(); // make a new address
addr.setStreet("Office Street");
addr.setCity("Office City");
addr.setState("Office State");
addr.setPincode("Office PinCode");
user.setOfficeAddress(addr);