Hibernate e VOs [RESOLVIDO]

Olá,
Imaginem a seguinte situação (exemplo bem simples):
Existe uma tabela “pessoa” com os campos “id”,“nome”,“rua”,“numero”,“bairro”.
Logo, eu faria o mapeamento da classe “Pessoa” contemplando todas as suas propriedades e atributos, mapeando para os respectivos campos na tabela.

//omitidos detalhes...
@Entity
public class Pessoa implements java.io.Serializable {

	private Integer id;
	private String nome;
	private String rua;
	private String numero;
	private String bairro;

	public Pessoa() {
	}

	@SequenceGenerator(name = "generator", sequenceName = "seq_usuarios_id", allocationSize=1)
	@Id
	@GeneratedValue(strategy = SEQUENCE, generator = "generator")
	@Column(name = "id", unique = true, nullable = false)
	public Integer getId() {
		return this.id;
	}

        public void setId(Integer id) {
		this.id = id;
	}

       @Column(name = "nome", nullable = false, length = 150)
	public String getNome() {
		return this.nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}

       @Column(name = "rua", nullable = false, length = 150)
	public String getRua() {
		return this.rua;
	}
	
	public void setRua(String rua) {
		this.rua = rua;
	}

       @Column(name = "numero", nullable = false, length = 10)
	public String getNumero() {
		return this.numero;
	}
	
	public void setNumero(String numero) {
		this.numero = numero;
	}

       @Column(name = "bairro", nullable = false, length = 150)
	public String getBairro() {
		return this.bairro;
	}
	
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

       //Detalhes omitidos...

}

A questão é:
Se eu quiser particionar a classe, criando uma classe Endereco e colocando um getter/setter de Endereco na classe Pessoa, como eu faria isso usando o hibernate? Tem como? Digo, como ficaria o mapeamento disso, uma vez que Endereco não representa uma tabela no banco de dados, é apenas um VO utilizado pela classe Pessoa…
Dúvida básica, eu sei… :roll:

Agradeço a atenção!

Uma maneira legal é anotar a classe Endereco com @Embeddable e na classe Pessoa colocar um Endereco e anotar ocm @Embedded assim todos atributos de endereco vão ficar na tabela Pessoa.

Putz é mesmo! É o que acontece com chaves compostas né…
Valeu!

Veja esse post no GUJ e entenda o motivo para evitar VOs.

Não vejo problema em utilizar um objeto de valor nesse caso, afinal, o intuito é apenas agrupar os atributos referentes a abstração do tipo Endereco.
Por exemplo, Eric Evans em seu livro sobre Domain-Driven Design cita a necessidade de objetos de valor, ou seja, que não necessitam de identidade.
Exemplo:

public class Order {
    
    private long orderId;    
    private String name;    
    private long quantity;    
    private Price price; //This is a reference to a ValueObject
    
    public Order(){}
    
    public Order(String name, long quantity, Price price) {
        this.name = name;
        this.quantity = quantity;
        this.price = price;
    }
    
    public double getUSDValue() {
        return price.getUSDAmount();
    }
}

//Price é um objeto de valor (VO).

public class Price {
    private long amount;
    private Currency amountCurrency; //This is a reference to an Entity

    public Price() {}
    public Price(long amount, Currency amtCurrency) {
        this.amount = amount;
        this.amountCurrency = amtCurrency;
    }

    public double getUSDAmount() {
        return this.amount * this.amountCurrency.getUsdConvRate();
    }
}

Acho que o que pode estar acontecendo é que podemos estar falando sobre VOs diferentes… ou então, o Eric Evans não entende nada de OO, uma vez que um dos intuitos do DDD é justamente reaproximar o desenvolvimento com a OO.
Mas valeu pelo link!

Talvez ele esteja confundindo com os conceitos de TO e VO, esses sim são desaconselhaveis.

Isso que eu pensei tbm…