Отображение базы данных в спящем режиме - PullRequest
1 голос
/ 26 марта 2012

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

Campaign
  campaignId(+)
  name

Promotion
  campaignId(+)
  discount(+)
  product
  message

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

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

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


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

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

Акция - это ванильное отображение (в конце концов, не использующее встроенный), с полями: campaignId, discount, message. (Он также не имеет аннотации @ManyToOne.)

Имеет ли это смысл?

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

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


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

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

Ответы [ 3 ]

1 голос
/ 26 марта 2012

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

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

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

1 голос
/ 26 марта 2012

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

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

public class Promotion
{
    @ManyToOne
    private Campaign campaign;
}
0 голосов
/ 29 марта 2012

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

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

    ...
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...