2008-11-25 5 views
0

У меня есть следующие объекты POJO:JPA/Hibernate отображение для хранения месяцев и дней-месяцев

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; 
} 

Есть ли способ, чтобы сохранить эти объекты в следующем структуру БД с помощью JPA + Hibernate:

Таблица МЕСЯЦЕВ:

id;description;

Таблица ДНЕЙ:

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

Любое лучшее решение для этой ситуации?

ответ

0

Вот одно решение я нашел:

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 и @IndexColumn являются Hibernate аннотации. Если я использую аннотацию @OneToMany, доступную в JPA, hibernate создает 3 таблицы вместо 2.

Моя единственная проблема в том, что Day.nr сохраняется дважды: сначала как IndexColumn из списка (счетчик на основе 0) и второй раз как поле класса День (счетчик на основе 1).

1

Если вы не можете изменить структуру своего почтового ящика или таблицы, вы немного ввернуты. Если вы можете, тогда будет работать простой аннотированный pojo.

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

} 

---- суррогатного ключевых изменений требуется БД для дней таблицы

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

Вы можете составить карту класса однонаправленных отношений Месяц @Entity с классом День @Entity без @Embeddable с CascadeType.PERSIST вместо этого, где идентификатор класса @Entity Day состоит из идентификатора месяца и индекса списка, как показано ниже?

@Entity общественного класса Месяц {

@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>(); 

}

день общественного класса @Entity {

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

}

Я надеюсь, что вы решить эту проблему

С уважением Arthur Ronald F D Garcia (Java-программист) Natal/Rn - Бразилия

Смежные вопросы