2008-11-25 10 views
0

J'ai POJO suivantes:cartographie JPA/Hibernate pour stocker des mois et des jours-de-mois

class Month { 
    long id; 
    String description; 
    List<Day> days; // always contains 29, 30 or 31 elements 
} 

class Day { 
    byte nr; // possible values are 1-31 
    String info; 
} 

Y at-il un moyen de stocker ces objets dans la structure suivante DB en utilisant JPA + Hibernate:

Table MOIS:

id;description;

Tableau: JOURS

id-of-month;nr-of-day;info;

Une meilleure solution pour cette situation?

Répondre

0

Voici une solution que je trouve:

class Month { 
    long id; 
    String description; 

    @CollectionOfElements(fetch = FetchType.EAGER) 
    @IndexColumn(name = "nr-of-day") 
    List<Day> days; // always contains 29, 30 or 31 elements 
} 

@Embeddable 
class Day { 
    byte nr; // possible values are 1-31 
    String info; 
} 

@CollectionOfElements et @IndexColumn sont des annotations Hibernate. Si j'utilise l'annotation @OneToMany disponible dans JPA, Hibernate crée 3 tables au lieu de 2.

Mon seul problème maintenant est que Day.nr est sauvegardé deux fois: d'abord en tant que IndexColumn de la liste (compteur basé sur 0) et deuxième fois comme champ de classe Jour (compteur basé sur 1).

1

Si vous ne pouvez pas changer la structure de votre table ou de votre table, vous êtes un peu vissé. Si vous pouvez alors un pojo simple annoté fonctionnera.

class Month { 
    @Id 
    private long id; 
    private String description; 
    @OneToMany(mappedBy="month",fetchType=Lazy) 
    private List<Day> days; 

} 

---- clés Surrogate changement DB requis pour la table Jours

class Day { 
    @Id 
    private int id; 
    private Month month; 
    private byte nr; // possible values are 1-31 
    private String info; 
} 
0

Pouvez-vous associez une classe Mois @Entity relation unidirectionnelles avec classe Day @Entity sans @Embeddable avec CascadeType.PERSIST à la place, où l'identifiant de la classe @Entity Day est composé par l'identifiant Month et l'index de la liste comme suit?

@Entity Mois public class {

@Id 
@GeneratedValue 
private Integer id; 


// one way relationship 
@OneToMany(cascade=CascadeType.PERSIST) 
@JoinColumn(name="MONTH_ID") 
@IndexColumn(name="childIndex") 
private List<Day> dayList = new ArrayList<Day>(); 

}

Jour @Entity public class {

@EmbeddedId // composed by month foreign key and index column 
private DayId id; 

}

Je vous souhaite résoudre ce problème

Cordialement Arthur Ronald F D Garcia (Programmeur Java) Natal/Rn - Brésil

Questions connexes