Insertable = false, updatetable = false?

Ola Pessoal!

Tenho as seguintes classes que estão relacionadas n p/ n:
obs: omiti gets. e sets

Pedido

@Entity
@Table(name="produtos")
public class Pedido implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=IDENTITY)
	private Integer id;

	@Column(name="cc_m_exp")
	private short ccMExp;

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

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

	@Column(name="cc_tipo")
	private int ccTipo;

	@Column(name="data_ped")
	private Timestamp dataPed;

	@Column(name="cc_a_exp")
	private int ccAExp;

	@ManyToOne
	private Usuario usuario;

	@OneToMany(mappedBy="pedido", fetch = LAZY)
	private List<ItensPedido> itens =  new ArrayList<ItensPedido>();

Produto


@Entity
@Table(name="produtos")
public class Produto implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=IDENTITY)
	private Integer id;

	@Column(name="desc_gd")
	@Lob
	private String descGd;

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

	private Double preco;
	
	private Double desconto;

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

	private String imagem;

	@ManyToOne(fetch=LAZY)
	@JoinColumn(name="cat_id", referencedColumnName = "id")
	private Categoria cat;

	@OneToMany(mappedBy="produto", fetch = LAZY, cascade = ALL)
	private Set<ItensPedido> itens;

ItensPedido

@Entity
@Table(name="itens_pedido")
public class ItensPedido implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@EmbeddedId
	private IPedidoPK id = new IPedidoPK();
	
	private Integer qtd;

	private Double preco;

	@ManyToOne
	@JoinColumn(name="ped_id", referencedColumnName = "id", insertable=false, updatable=false) ///nesta linha
	private Pedido pedido; 
	
	
	@ManyToOne
	@JoinColumn(name="prod_id", referencedColumnName = "id", insertable=false, updatable=false) /// nesta linha
	private Produto produto;

IPedidosPK

@Embeddable
public class IPedidoPK implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	@Column(name = "ped_id")  
	private Integer pedId;
	
	@Column(name = "prod_id")  
	private Integer prodId;

O que gostaria de saber é o que representam as linhas que possuem os atributos ‘insertable = false’ e updatetable = false’??

Desde jáa agradeço

Insertable diz se é possível inserir novos registros na tabela.
Updateable diz se é possível atualizar os registros na tabela.

Significa que naquela coluna da tabela do BD não vai se poder inserir nem atualizar informações.

Isso é usado para que o hibernate não tente salvar a mesma informação através de dois atributos diferentes; inclusive, o hibernate dá erro nesse caso.

Quando você os define como false, o hibernate só faz consulta desses campos, ignorando-os em operações de insert ou update.

Note que, em ItensPedido, IPedidoPK já tem as informações de produto e de pedido. Os atributos pedido e produto estão presentes na classe para evitar que o desenvolvedor tenha que buscar programaticamente por eles através de seus ids toda vez que quiser recuperar dados deles. Do jeito que estão, o hibernate sempre vai carregar esses dados junto com a classe.

Exemplificando:

Dado um ItensPedido, o desenvolvedor que saber o nome do produto e a data do pedido. Sem esses atributos, provavelmente ele teria que fazer algo assim:

ItensPedido it = itemEscolhido; //alguma forma de definir qual o ItensPedido a ser trabalhado. Pedido ped = classeBuscaNoBanco.findById(Pedido.class, it.getId().getPedId()); //pode ser necessário tratar exceptions... Produto prod = classeBuscaNoBanco.findById(Produto.class, it.getId().getProdId()); //pode ser necessário tratar exceptions... String nomeProduto = prod.getProdNome(); Date dataPedido = ped.getDataPed();

Com os atributos pedido e produto inclusos na classe ItensPedido , o trabalho fica muito mais simples e mais otimizado:

ItensPedido it = itemEscolhido; //alguma forma de definir qual o ItensPedido a ser trabalhado. String nomeProduto = it.getProduto().getProdNome(); Date dataPedido = it.getPedido().getDataPed();

Abraços