2012-03-26 5 views
1

Во-первых, я немного новичок в Hibernate. Чтобы познакомиться с технологией, я использую ее в проекте. Я пытаюсь отобразить следующую базу данных:Отображение базы данных спящего режима

Campaign 
    campaignId(+) 
    name 

Promotion 
    campaignId(+) 
    discount(+) 
    product 
    message 

Я указанный первичный ключ в обоих случаях с (+). «CampaignId» в продвижении является внешним ключом кампании для моделирования отображения 1: m (в кампании есть много рекламных акций). Используя аннотации, я задерживаюсь, как это сделать.

Я действительно не хочу добавлять promotionId в таблицу Promotion, так как это делает работу с данными громоздкой. Это, конечно же, делает сложный стол немного сложнее. У меня также проблемы с внешним ключом, который также является частью первичного ключа.

Является ли отображение для этого возможным вообще?


Хорошо, я заработал. Вроде. Необходимо проверить, действительно ли упорство работает. Я сделал следующее:

@Entity 
@Table(name = "CAMPAIGNS") 
@Audited 
public class CampaignEntity { 
    private int campaignId; 
    private String name; 
    private List<PromotionEntity> promotions; 

    public CampaignEntity(int campaignId, String name) { 
     this.campaignId = campaignId; 
     this.name = name; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "cmp_id") 
    public int getCampaignId() { 
     return campaignId; 
    } 

    public void setCampaignId(int campaignId) { 
     this.campaignId = campaignId; 
    } 

    // Campaign name here... left out to save space 

    @OneToMany 
    @JoinColumn(name = "cmp_id") 
    public List<PromotionEntity> getPromotions() { 
     return promotions; 
    } 

    public void setPromotions(List<PromotionEntity> promotions) { 
     this.promotions = promotions; 
    } 
} 

Promotion является отображением ванили (не используя встроенное в конце концов), с полями: CAMPAIGNID, скидками, сообщениями. (Он также не имеет аннотации @ManyToOne.)

Это имеет смысл?

И, наконец, это будет первый приз: как вы можете видеть, я использую Envers для проверки всего этого. Вышеприведенное создает довольно уродливую таблицу CampaignEntity_PromotionEntity_AUD. Я понимаю, что это необходимо, но как я могу переименовать его в CAMPAIGN_PROMOTION_AUD?

Спасибо, ребята!


Я получил ответ на одиноком сайте глубоко спрятан в далеких уголках Jira сайта отслеживания ошибок в в Hibernate: https://hibernate.onjira.com/browse/HHH-3729.

Ответ заключается в использовании @AuditJoinTable (name = "CAMPAIGN_PROMOTION_AUD"), конечно.

+0

Вы имеете в виду, возможно, что вы не хотите, чтобы promotionId в таблице * Кампания? Я не уверен, как это имеет смысл. –

+0

Правильно, идентификатор кампании должен находиться в таблице Promotion как один столбец (cmp_id), который также является частью первичного ключа Promotion. (см. выше.) Я думаю, что у меня есть это с отредактированным решением выше, спасибо за помощь. –

ответ

0

Это то, что я сейчас использую. Он работает хорошо, и Hibernate обрабатывает PKs Promotions для меня. Еще раз спасибо.

@Entity 
@Table(name = "CAMPAIGNS") 
@Audited 
public class CampaignEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", nullable = false) 
    private Integer campaignId; 

    @Column(name = "name", nullable = false, unique = true) 
    private String campaignName; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinTable(name = "CAMPAIGN_PROMOTIONS", 
       joinColumns = { @JoinColumn(name = "campaign_id") }, 
       inverseJoinColumns = { @JoinColumn(name = "promotion_id") }) 
    private Set<PromotionEntity> promotions; 

    ... 
} 

, а затем, PromotionEntity:

@Entity 
@Table(name = "PROMOTIONS") 
@Audited 
public class PromotionEntity implements Comparable<PromotionEntity> { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @Column(name = "discount", nullable = false) 
    private Integer discount; 

    @Column(name = "message", nullable = false) 
    private String message; 

    ... 
} 

Я также предпочитаю аннотирования поля, а не методы получения, поскольку это более компактный и читает проще.

1

Это основной пример отношения «один ко многим» и его обратного.

public class Campaign 
{ 
    @OneToMany(mappedBy = "campaign) 
    private List<Promotion> promotions; 
} 

public class Promotion 
{ 
    @ManyToOne 
    private Campaign campaign; 
} 
+0

Это не совсем так ... запись в кампании «Кампания» затрудняет определение ее как части первичного ключа Promotion. Мне нужно, чтобы «campaign_id» был внешним ключом в этой таблице, а также являлся частью первичного ключа Promotion. «Идентификатор кампании» вместе с «скидкой» однозначно определяет объект. –

+1

Почему он должен быть частью первичного ключа? Просто используйте нерабочее PK (то есть поле «id») и определите свои бизнес-ключи как (уникальные) индексы. –

+0

Когда кампания обновляется с внешнего интерфейса, я получаю Кампанию с набором рекламных акций (содержащих скидку, продукт и сообщение). Теперь я должен написать запрос, чтобы найти все PK Promotions, просто обновив Кампанию. (Помните, у меня нет ПК из коллекции.) Это звучит ужасно неправильно для меня. –

1

Вы можете использовать EmbeddedId для создания многопрофильного ПК с.

  • Удалить поля PK из Promotion
  • Создать отдельный объект, скажем PromotionPK, без каких-либо аннотаций для @Column на полях PK кроме
  • В Promotion, включают в себя, что ПК класса в качестве поля, аннотирования его с помощью @EmbeddedId , с геттерами и сеттерами

Отображение FK соответствует указанному Wouter.

+0

Не против ли ты дать короткий пример? Я не знаю, как сопоставить аннотацию @ManyToOne, используя этот составной ключ ... где это происходит? В составном ключе или в классе Promotion? –

+0

Я отсортирован ... спасибо за помощь. –

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