Hibernate составной генератор идентификаторов ключей - PullRequest
3 голосов
/ 01 октября 2011

У меня есть мои сущности, как показано ниже.Моя модель данных приведена ниже, и я не могу изменить ссылочную целостность.Так что я застрял с составным ключом.Я хочу автоматически сгенерировать / использовать генератор для orderId

Да, я читал ниже.http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping-identifier

Я не хочу управлять процессом генерации идентификатора, так как выше рекомендует приложение, генерирующее orderId.

Как заставить работать генератор частичного идентификатора ... какие у меня варианты ...оцените некоторые мысли экспертов.

@Entity
@Table(name = "Orders", uniqueConstraints = @UniqueConstraint(columnNames = {"partner_ID", "order_ident" }))
public class Order  {

private OrderId id;

public Order() {
}


@EmbeddedId
@AttributeOverrides({
        @AttributeOverride(name = "partnerId", column = @Column(name = "partner_ID", nullable = false)),
        @AttributeOverride(name = "employeeId", column = @Column(name = "employee_ID", nullable = false)),
        @AttributeOverride(name = "orderId", column = @Column(name = "order_ID", nullable = false)) })
public OrderId getId() {
    return this.id;
}

public void setId(OrderId id) {
    this.id = id;
}


}


@Embeddable
public class OrderId extends FactObject {

private int partnerId;
private int employeeId;
private int orderId;

public OrderId() {
}

public OrderId(int partnerId, int employeeId, int orderId) {
    this.partnerId = partnerId;
    this.employeeId = employeeId;
    this.orderId = orderId;
}

@Column(name = "partner_ID", nullable = false)
public int getpartnerId() {
    return this.partnerId;
}

public void setpartnerId(int partnerId) {
    this.partnerId = partnerId;
}

@Column(name = "employee_ID", nullable = false)
public int getemployeeId() {
    return this.employeeId;
}

public void setemployeeId(int employeeId) {
    this.employeeId = employeeId;
}

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
@Column(name = "order_ID",insertable=false, nullable=false,  updatable=false)
public int getOrderId() {
    return this.orderId;
}

public void setOrderId(int orderId) {
    this.orderId = orderId;
}

public boolean equals(Object other) {
    if ((this == other))
        return true;
    if ((other == null))
        return false;
    if (!(other instanceof OrderId))
        return false;
    OrderId castOther = (OrderId) other;

    return (this.getpartnerId() == castOther.getpartnerId())
            && (this.getemployeeId() == castOther.getemployeeId())
            && (this.getOrderId() == castOther.getOrderId());
}

public int hashCode() {
    int result = 17;

    result = 37 * result + this.getpartnerId();
    result = 37 * result + this.getemployeeId();
    result = 37 * result + this.getOrderId();
    return result;
}

}

Ответы [ 4 ]

7 голосов
/ 11 апреля 2012

Я наводил курсор на все возможные ссылки на всемирных веб-сайтах и ​​пытался выяснить, почему вы не можете использовать @GeneratedValue с @EmbeddedId или @IdClass (т.е. составные PK).Причина в том, что вы просто не можете.Объяснение, приведенное здесь, может помочь вам чувствовать себя немного лучше: JAVA.NET / GLASSFISH

Композитные ПК основаны на НАЗНАЧЕНИИ, а не на ПОКОЛЕНИИ.Поэтому любые вещи @GeneratedValue не должны работать с ними.У меня также есть проблема в моем проекте, и я думаю, что другого пути нет, КРОМЕ:

Если вы знаете, что ваш идентификатор @GeneratedValue всегда уникален в контексте вашего домена (например, вашей базы данных) вам не нужно использовать составной PK и выполнять некоторые внутренние проверки для определения уникальности ваших записей (т. е. коллекций персистентных объектов).

1 голос
/ 11 июля 2013

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

0 голосов
/ 04 мая 2018

Стратегия генерации составного первичного ключа может управляться @IdClass. Аннотируйте класс с помощью @IdClass, для которого вам нужен составной pk. Аннотируйте поля, которые делают для составного ПК с @Id и @GeneratedValue. Это работает. например,

@Entity
@IdClass(B.class)
Class A {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private int i;
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private int j;

    private String variable;
}

Class B implements Serializable{
    private int i;
    private int j;

    public int geti(){return i;}
    public int getj(){return j;}
}

В этом примере комбинация i и j будет работать как составной первичный ключ для A. Их значения генерируются автоматически.

0 голосов
/ 23 октября 2014

Разве использование @IdClass не является решением? Можно использовать @Id в каждом из столбцов, которые образуют первичный ключ, а @GeneratedValue и @SequenceGenerator в столбце @Id, который должен быть сгенерирован последовательностью.

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