2010-05-10 46 views
7
Create Table A (
ID varchar(8), 
Primary Key(ID) 
); 

Create Table B (
ID varchar(8), 
A_ID varchar(8), 
Primary Key(ID), 
Foreign Key(A_ID) References A(ID) 
); 

Dado que yo he creado dos tablas utilizando las sentencias SQL anterior, y quiero crear Entity clases para ellos, para la clase B, tengo estos atributos de miembro:Java JPA @OneToMany necesario para reciprocar @ManyToOne?

@Id 
@Column(name = "ID", nullable = false, length = 8) 
private String id; 
@JoinColumn(name = "A_ID", referencedColumnName = "ID", nullable = false) 
@ManyToOne(optional = false) 
private A AId; 

En la clase A, ¿Necesito corresponder a la relación de muchos a uno?

@Id 
@Column(name = "ID", nullable = false, length = 8) 
private String id; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "AId") 
private List<B> BList; //<-- Is this attribute necessary? 

¿Es una condición necesaria o una buena idea tener un recíproco @OneToMany para la @ManyToOne? Si tomo la decisión de diseño de omitir el atributo anotado @OneToMany ahora, ¿eso volvería a afectarme más?

Respuesta

11

¿Es necesario o una buena idea tener un @OneToMany recíproco para @ManyToOne?

No, no es obligatorio en absoluto, es una decisión de diseño puro. Toda la cuestión es ... ¿Quieres esto (es decir, una asociación unidireccional):

uni-directional

O esto (es decir, una asociación bidireccional):

bi-directional

Si no necesita obtener Bs desde A, entonces puede omitir el atributo bs y el OneToMany en el lado A.

Si tomo la decisión de diseño de omitir ahora el atributo anotado @OneToMany, volveré para morderme más abajo.

No, y puede agregarlo más tarde si descubre que lo necesita.

+0

+1 y marque @Pascal Thivent: Por señalar puedo agregarlo más tarde si lo necesito: esa fue mi principal preocupación. – bguiz

+0

Normalmente trato de evitar mapeos unidireccionales tanto como sea posible. El hecho de que algo en la base de datos se modele con una tabla de combinación separada (por la razón que sea) no significa que mi modelo de objeto tenga que hacer lo mismo. En el ejemplo anterior, un OneToOne-Mapping sería suficiente para la solución unidireccional (por supuesto, esto debe cumplir con el dominio). – lostiniceland

2

Son opcionales. No es necesario agregarlos a su modelo si no desea usarlos.

Sugiero evitar el mapeo inverso en absoluto porque tales colecciones pueden llegar a ser bastante grandes y la mayoría de las capas persistentes no manejan estas muy buenas. En muchos casos, tendrá que encargarse usted mismo de agregar/eliminar entidades ya cargadas/administradas relacionadas con estas colecciones. Así que solo agréguelos si realmente hacen las cosas más fáciles para usted.

+0

+1 @Daniel Bleisteiner: La gran cantidad de código necesario para manejarlos puede ser bastante difícil de manejar. Gracias por el consejo – bguiz

Cuestiones relacionadas